OOP (객체지향 프로그래밍)
객체를 기준으로 한 코드를 통해 필요한 속성과 기능을 부여하여 관리하고,
필요에 따라 특정 기능을 가진 객체들을 조합하여 결과물을 만드는 프로그래밍 기법.
ex)

자판기 라는 물체를 위해 각 속성과 기능에 따라 여러 객체를 나누어 생산하고 조합함.
A. OOP - SOLID 원칙
1. S (단일 책임 원칙) :
하나의 클래스는 하나의 책임만 가지고 있다.
2. O (개방-폐쇄 원칙) :
확장에는 열려있지만, 변경에는 닫혀 있어야 한다.
3. L (리스코프 치환 원칙) :
프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 객체로 바꿀 수 있어야 한다.
자식클래스의 객체는 부모 클래스의 참조변수를 대입해서 역할 수행이 가능해야 한다.
4. I (인터페이스 분리 원칙) :
인터페이스의 단일 책임을 위한 원칙.
하나의 인터페이스를 조금 더 구체적인 인터페이스로 쪼개는 것이 낫다.
ex) Bird Behave 인터페이스 -> Fly 인터페이스, Cry 인터페이스
5. D (의존 관계 역전 원칙) :
추상화에 의존해야지, 구체화에 의존하면 안된다.
자주 변경되는 구체 클래스에 의존하지 않고, 추상화된 클래스에 의존한다.
B. 추상화
객체의 공통적인 속성과 기능(메서드)을 뽑아서 상위/하위 클래스로 정의하고,
해당 클래스를 상속받는 하위 클래스에서 메서드를 '오버라이딩'하여 필요에 따라 재정의 하도록 한다.
즉, 추상화는 공통적인 속성과 기능을 정의함으로써,
코드의 중복을 줄이고, 클래스 간 관계를 효과적으로 설정하고, 유지/보수를 용이하게 하는 것.
abstract class Animal {
public String kind;
public abstract void sound();
}
class Dog extends Animal { // Animal 클래스로부터 상속
public Dog() {
this.kind = "포유류";
}
public void sound() { // 메서드 오버라이딩 -> 구현부 완성
System.out.println("멍멍");
}
}
class Cat extends Animal { // Animal 클래스로부터 상속
public Cat() {
this.kind = "포유류";
}
public void sound() { // 메서드 오버라이딩 -> 구현부 완성
System.out.println("야옹");
}
}
class DogExample {
public static void main(String[] args) throws Exception {
Animal dog = new Dog();
dog.sound();
Cat cat = new Cat();
cat.sound();
}
}
B-1. 추상 클래스
1. 단일 상속만 가능
2. 변수를 가질 수 있다.
3. 하나 이상의 추상 메서드가 존재해야 한다.
4. 자식 클래스에서 상속을 통해 추상 메서드를 구현해야 한다.
B-2. 인터페이스
1. 다중 구현을 지원한다.
2. 변수는 static final (상수)만 가질 수 있다.
3. 모든 메서드는 메서드 시그니처만 존재한다.
4. 구현 클래스는 인터페이스에 선언된 모든 메서드를 오버라이딩 해야 한다.
[추상 클래스&인터페이스 공통점]
1. 추상 메서드만 가지고 있고, 상속 받는 클래스에서 추상메서드를 오버라이딩 해야 한다.
2. 추상메서드로 정의되어 있지 않는 부분이 상속받는 클래스에서 정의를 끝내기 전까지 객체 생성 불가.
[추상 클래스&인터페이스 차이점]
1. 추상 클래스는 다중 상속 X, 인터페이스는 다중 상속이 가능.
2. 추상 클래스는 필드(변수)가 일반 클래스와 동일하지만,
인터페이스는 모든 필드가 public static final(상수)로 구성되어 있다.
C. 캡슐화
관련이 있는 변수와 메서드를 하나의 클래스로 묶고, 외부에서 접근하지 못하도록
접근 제어자 (private) 형태로 클래스를 생성하고
이 후 필요에 따라 해당 클래스에서 제공하는 Getter나 Setter 등의 메서드를 통해서
간접적으로만 접근이 가능하도록하여 데이터를 은닉화 하는 것이 캡슐화의 목적.
D. 상속성
기존의 상위 클래스에 근거하여 이를 상속받는 하위 클래스를 생성하여
상위 클래스의 멤버(필드, 메서드, 내부 클래스)를 하위 클래스와 공유하는 것을 의미.
즉, 새로운 클래스를 생성할 때 기존 클래스의 기능을 가져와,
재사용할 수 있으면서도, 동시에 새로운 기능을 정의할 수 있게 해준다.
E. 다형성
한 타입의 참조 변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것.
즉 상위 클래스 타입의 참조 변수를 통해서 하위 클래스의 객체를 참조할 수 있도록 허용한 것.
이를 통해 코드의 재사용, 코드 길이 감소가 되어 유지 보수에 용이하다.
< 참조변수_타입(상위_클래스) 변수명 = new 생성자(하위_클래스) > 만 가능하고, 반대는 불가
class Friend {
public void friendInfo() {
System.out.println("나는 당신의 친구입니다.");
}
}
class BoyFriend extends Friend {
public void friendInfo() {
System.out.println("나는 당신의 남자친구입니다.");
}
}
class GirlFriend extends Friend {
public void friendInfo() {
System.out.println("나는 당신의 여자친구입니다.");
}
}
public class FriendTest {
public static void main(String[] args) {
Friend friend = new Friend(); // 객체 타입과 참조 변수 타입의 일치
BoyFriend boyfriend = new BoyFriend();
Friend girlfriend = new GirlFriend(); // 객체 타입과 참조 변수 타입의 불일치
friend.friendInfo();
boyfriend.friendInfo();
girlfriend.friendInfo();
}
}
< OOP 장점 >
1. 코드의 재사용성이 높다.
2. 유지보수가 용이하다.
3. 코드가 간결해진다.
< OOP 단점 >
1. 처리 시간이 비교적 오래 걸린다.
2. 프로그램 설계 단계에서 많은 고민과 시간 투자가 요구된다.
'백엔드 기술 > Java' 카테고리의 다른 글
Static 키워드 (0) | 2023.04.15 |
---|---|
메서드 오버라이딩 VS 오버로딩 (0) | 2023.04.15 |
추상 클래스와 인터페이스 차이 (0) | 2023.04.12 |
클래스와 객체의 차이 (0) | 2023.04.12 |
Java 데이터 타입의 기본형 & 참조형 타입 (0) | 2023.04.12 |