특징
1. 추상화 (Abstraction)
불필요한 정보는 숨기고, 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것
- 현실의 사물들은 다양한 정보를 가지고 있다.
- 구체적인 사물들로부터 공통적인 특징을 뽑아낸다.
- 우리에게 쓸모있는 정보만을 추출하고 나머지는 생략한다.
추상화를 통해 정의된 자료형을 추상 자료형이라고 한다.
추상 자료형은 자료형의 data와 operation을 캡슐화한 것으로, 접근 제어를 통해 이를 은닉할 수 있다.
추상 자료형 = class
class를 실제로 구현한 것 = instance
class 내의 data = member variable
class 내의 operation (function) = method
2. 캡슐화 (Encapsulation)
class의 data와 operation을 외부에서 직접 접근하지 못하도록 은닉하는 것
- data & operation -> 접근 제어자 설정
- private < default < protected < public
- getter / setter함수를 통해 간접적으로 접근할 수 있다.
3. 상속성 (Inheritance)
상위 클래스의 자료와 연산을 하위 클래스가 물려받아 이용할 수 있게 하는 것
- 여러 클래스의 공통특징을 뽑아 상위 클래스로 만든 것.
- 코드의 재사용성을 높여줌.
- 현실세계의 relationship을 보다 직관적인 방법으로 따라한다.
4. 다형성 (Polymorphism)
하나의 메소드나 클래스가 다양한 방법으로 동작하는 것
- 일반적으로 오버라이딩이나 오버로딩을 의미
- 오버로딩 : 같은 이름의 메소드가 파라미터의 개수나 타입에 따라서 다른 기능을 하는 것
- 오버라이딩 : 같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것
- 상속과 연계된다.
- 부모 클래스를 extends할 때, 부모의 메서드를 오버로딩하여 다르게 사용한다.
- 인터페이스를 implements할 때, 인터페이스에서 헤더만 존재했던 메서드를 오버라이딩하여 다르게 사용한다.
보충
1. Inheritance = generalization + realization
- generalization은 부모 클래스를 '상속'받는 것이고, realization은 인터페이스를 '상속'받아 구현하는 것이다.
- 즉 '상속'이란 개념은 부모 클래스와 인터페이스 둘 다에 쓰일 수 있다.
2. 캡슐화가 필요한 이유
- 문법적 일관성을 제공한다.
- 멤버변수의 read/write할 때, getter/setter함수를 사용하면 된다.
- 모든 개발자들은 일관적인 함수를 통해서 접근할 수 있다.
- getter / setter함수의 존재여부로 멤버변수에 대한 read / write 권한을 구별할 수 있다.
- getter함수만 있다면, 이 멤버 변수는 읽기만 가능하다는 뜻!
- 구현의 유연성
- 멤버변수를 read / write하기 전에 precondition이 있다면 getter / setter에서 이를 구현할 수 있다.
- public한 멤버 변수에 직접 접근한다면 이렇게 할 수 없다. 일일히 호출해야 함.
- 유지보수 용이
- 캡슐화가 없다면, public으로 제공되는 어떤 클래스의 멤버변수와 멤버함수가 수정이 되었을 경우 이를 사용하는 외부의 모든 코드를 수정해야 한다.
- student.score처럼 직접 접근한다고 했을 때, 변수 score이름이 바뀌는 경우를 상상해보자. 끔찍하다.
- 캡슐화를 통해, 외부로부터 은닉한 멤버변수, 멤버함수의 수정이 발생하더라도 외부의 코드를 수정할 필요가 없어진다.
출처
'학습 > Java' 카테고리의 다른 글
[java] 템플릿 엔진 / SSR & CSR / JSP와 Mustache / 정적파일 (0) | 2020.02.10 |
---|---|
[java] 테스트를 도와주는 JUnit / assertJ / h2 (0) | 2020.02.09 |
[java] @Entity와 @Builder (0) | 2020.02.05 |
[java] Shy Code를 깨트리는 Lombok의 @Data 어노테이션 (0) | 2020.01.23 |
[java] war파일 import하여 코드 수정한 뒤, 다시 export하기 (0) | 2019.05.29 |
댓글