✨ OOP에 대해 공부한 것을 정리합니다.
Object Oriented Programming : 객체 지향 프로그래밍
현실 세계의 사물 및 개념들을 객체로 판단하고 그 객체들을 조립하여 프로그래밍하는 기법이다.
절차 지향 프로그래밍의 코드의 재사용성과 중복 제거가 가장 큰 목적이다.
예시
class People{
private String name;
private int age;
public getName(){
return name;
}
public getAge(){
return age;
}
public setName(String name){
this.name = name;
}
public setAge(int age){
this.age = age;
}
}
캡슐화를 이해하는 가장 쉬운 예제는 클래스에서 private을 사용해 멤버변수의 접근 제어자를 설정하는 것이다. 접근 제어자를 통해 외부에서 직접 접근이 불가능하게 만들어주면 된다. 해당 멤버변수를 접근하기 위해 get, set 메서드를 통해 간접적으로 데이터에 접근할 수 있다.
예시
class People{
String name;
int age;
People(String name, int age){
this.name = name;
this.age = age;
}
}
class Woman extends People{
private String gender;
Woman(String name, int age, String gender){
super(name, age);
this.gender = gender;
}
}
extends의 앞부분에 있는 클래스 명은 자식 클래스, extends 뒤에 있는 클래스는 부모 클래스이다. 부모 클래스는 자신이 가진 속성을 자식 클래스에서 사용할 수 있도록 한다. 자바에서는 단일 상속만 가능하다. 단, 부모 클래스를 구현할 때는 private인 필드는 상속되지 않는다는 점을 참고해야 한다. 이부분은 OOP의 특징인 캡슐화를 위반한다고 개인적으로 생각한다.
예시
편의상 get, set 메서드는 구현하지 않습니다.
public abstract class People{
String name;
int age;
public void eat();
}
class Woman extends People{
private String gender;
Woman(String gender){
this.gender = gender;
}
@Override
public void eat(){
System.out.println("음식을 먹다.");
}
}
추상화는 공통된 요소를 클래스로 만든다. 이때 만들어진 클래스를 추상 클래스라고 하며 abstract를 붙여준다. 추상 클래스는 추상 메서드가 하나 이상 있어야 한다. 추상 메서드는 eat 메서드와 같이 구현되지 않은 메서드를 뜻한다.
추상 클래스를 상속받은 클래스는 반드시 추상 메서드를 구현해야 한다. 구현하는 메서드 위에는 @Override를 붙여준다. (이 어노테이션의 역할은 다형성을 설명하면서 같이 한다.)
성립 조건
구분 | 오버로딩 | 오버라이딩 |
---|---|---|
메서드 이름 | 동일 | 동일 |
매개변수, 타입 | 다름 | 동일 |
리턴 타입 | 동일하거나 다름 | 동일 |
오버로딩 예시
class People{
private String name;
private int age;
private String gender;
People(String name){
this.name = name;
}
People(String name, int age){
this.name = name;
this.age = age;
}
People(String name, int age, String gender){
this.name = name;
this.age = age;
this.gender = gender;
}
}
People의 생성자를 오버로딩한 예시이다. 메서드의 이름은 People로 모두 갖지만 매개변수의 개수나 타입이 모두 다르다. 오버로딩할 때는 메서드의 이름은 같지만 매개변수의 타입이나 개수를 다르게 구현해야 한다.
오버라이딩 예시
public class People{
String name;
int age;
public void eat(){
System.out.println("밥을 먹다.");
};
}
class Woman extends People{
private String gender;
Woman(String gender){
this.gender = gender;
}
@Override
public void eat(){
System.out.println("고기를 먹다.");
}
}
Woman 클래스는 People를 상속받았다. 상위 클래스의 메서드인 eat을 하위 클래스인 Woman에서 구현하는 내용을 수정하였다. 따라서 woman.eat()은 "고기를 먹다."를 출력하고 people.eat()은 "밥을 먹다."를 출력한다. 만약 People의 eat 문장도 출력하려면 super 키워드를 사용한다.
@Override는 해당되는 메서드가 오버라이딩된 메서드임을 명시한다.
객체 중심의 프로그래밍
1. 사람의 관점에서 프로그램을 이해하고 파악
2. 관계는 있지만 없어도 대체해서 동작시킬 수 있는 유연함
3. 재사용성, 확장성, 융통성
장점
장점