객체지향의 4대 특성 (클래스, 객체, 인스턴스, 캡슐화, 상속, 추상화, 다형성)
1. 클래스와 객체
가장 흔한 설명중에 대표적으로 잘못된 것은 붕어빵이야기다. 클래스 = 붕어빵틀, 객체 = 붕어빵에 비유하며, 붕어빵틀에서 붕어빵을 찍어낸다는 이야기다. 하지만 코드로 보면 이 비유는 틀렸다. 클래스 객체변수명 = new 클래스(); 에 대입해보면, 붕어빵틀 붕어빵 = new 붕어빵틀(); 이다. 말이 안되는 예제이다. 여기서 붕어빵틀은 붕어빵을 만드는 Factory로 이해를 해야지, 클래스와 객체관계로 이해하면 안된다. 클래스는 추상적이고, 클래스라는 단어대로 분류에 대한 개념이지, 실체가 아니다. 하지만 객체는 실체이다. class Person이 있고, Person ljh = new Person(); 이 말이 되는 것이다.
- 클래스 : 같은 특성을 지닌 여러 객체를 총칭하는 집합의 개념
- 객체 : unique한 사물, 생물
객체와 인스턴스
일반적으로 설계도인 클래스가 구체적인 실체인 인스턴스가 되었을 때 객체라고 부른다. 보통은 구체적인 코드 상에서 나타는 객체를 인스턴스라고 부르고, 로직을 설계 할 때 나타나는 인스턴스를 객체라고 부른다.
2. 캡슐화(Encapsulation) = 정보 은닉
접근제어자(private, protected, public)를 사용해 객체 외부에서 내부 데이터의 접근을 통제하는 것이다. 보통 public한 메소드에서만 접근가능하게 해서, 인터페이싱을 맞춘다.
3. 상속(Inheritance) = 재사용 + 확장
상속에서 주의할 점은 위처럼 계층도, 조직도 관점(할아버지를 상속받은 아버지?)에서 이해하면 안된다.
분류도 관점에서 이해해야한다. 포유류의 부모가 동물은 아니지만, class 포유류 extends 동물로 충분히 구현된다. 객체지향에서 상속은 상위 클래스의 특성을 하위 클래스에서 상속하고 더 필요한 속성을 확장해서 쓰는 것이다. 애초에 extends 라는 키워드만 보아도 java의 의도를 알 수있다. 메모리관점에서는 하위클래스의 인스턴스가 생성될 때, 상위클래스의 인스턴스도 같이 생성된다. (생성자가 호출되는 걸 보면 알 수 있음) 당연히 lang.Object도 생성된다. (그러니까 toString()을 쓸 수 있는 것)
상속관계에서 만족해야하는 조건
상속관계에서 반드시 만족해야하는 문장들이 있다.
- 하위클래스는 상위클래스이다.
- 하위클래스 is a kind of 상위클래스
상속과 인터페이스
구현클래스 is able to 인터페이스 일 때 사용하면 좋다. 자바 api에서는 Runnable, Serializable 등을 예로들 수 있다. 인터페이스명도 *able 형태로 쓰면 좋을듯. 상위클래스는 물려줄 특성이 풍성할 수록 좋고, 인터페이스는 구현을 강제할 메서드의 개수가 적을수록 좋다.
4. 추상화(Abstraction) = 모델링
객체지향의 추상화는 모델링이다. 추상화란 구체적인 것을 관심영역(해당 애플리케이션, 서비스의 도메인)에 있는 특성만을 가지고 재조합하는 것을 말한다. 예를들어 class Person은 병원이라면 환자 도메인에 맞는 속성이 좀 더 많을 것이고, 상점이라면 고객입장에서의 속성이 좀 더 많을 것이다.
5. 다형성(Polymorphism) = 사용편의
오버라이딩(overriding)과 오버로딩(overloading)이 여기에 해당된다. 오버라이딩은 상위클래스의 메서드와 같은 시그니처(이름, 반환형, 인자)로 메소드를 재정의하는 것을 말한다. 오버로딩은 메소드이름만 같고 시그니처가 다른 것들을 말한다.
이때 유의할 점은 변수타입을 상위클래스로 써서, 메소드를 호출한다고 해도 하위클래스에서 오버라이딩한 메소드의 로직이 호출된다는 점이다.
출처: https://sjh836.tistory.com/158?category=679845 [빨간색코딩]
'JAVA > Java' 카테고리의 다른 글
[Java] Java 클래스 로딩 과정(Java Class Loading Process) (0) | 2021.03.29 |
---|---|
Enum 찾기의 달인 (효율적으로 찾기, spring bean과 맵핑) (0) | 2021.03.21 |
lambda (람다, 표현식, 함수형 인터페이스, default 메소드, 메소드 레퍼런스) (0) | 2021.03.21 |
객체지향 설계 5원칙 SOLID (SRP, OCP, LSP, ISP, DIP) (0) | 2021.03.21 |
스레드덤프 (thread dump) (0) | 2021.03.21 |
중첩클래스를 알아보자 (내부클래스, 정적 중첩클래스, 지역클래스, 익명클래스) (0) | 2021.03.21 |
최상위 객체 Object 클래스(주요 메소드, finalize 이슈) (0) | 2021.03.21 |
apache commons (StringUtils) (0) | 2021.03.19 |