객체지향 프로그래밍(Object-Oriented Programming, OOP)
- 로직을 상태(state)와 행위(behave)로 이루어진 객체로 만드는 것이다.
- 객체지향 언어의 4대 특징
- 추상화(Abstraction) : 구현하는 객체들이 가진 공통적인 데이터와 기능을 도출해 내는 것
- 다형성(Polymorphism) : 부모의 타입으로 다양한 형태의 자식 객체를 생성, 참조 할 수 있는것
- 상속(Inheritance) : 상위 개념의 특징을 하위 개념이 물려받는 것을 말한다.
- 캡슐화(Encapsulation) : 데이터 구조와 데이터를 다루는 방법을 결합시켜 묶는 것
상속
- 상속은 상위 개념의 특징을 하위 개념이 물려 받는 것이다.
- 클래스 상속의 이유 : 각 클래스에 공통적으로 반복되는 부분을 묶어서 독립된 클래스로 만든다. 그리고 각 클래스는 그 클래스를 상속 받도록 한다.
IS-A 관계
- 프로그래밍에서는 is-a 관계가 성립할 때에만 상속 관계를 맺어주라고 한다.
- is-a 관계 : "하위 클래스 is a 상위 클래스"가 True인 경우
상속의 표현
- 코드에서 상속을 표현하는 방법
- 부모 클래스는 일반 클래스 만드는 방법으로 작성한다.
- 자식 클래스 선언 시, extends 키워드를 이용하여 부모 클래스를 상속 받는다.
- 자식 클래스에서 부모 클래스의 것까지 확장하여 사용할 수 있다는 의미이다.
public class 자식클래스명 extends 부모클래스명 {}
- 자식 클래스의 이름으로 객체를 생성하면, 부모 객체가 먼저 생성되고 자식 객체가 생성
- 따로 부모 클래스 객체를 생성하지 않아도 부모의 멤버를 사용할 수 있음
HAS-A 관계
- is-a 관계 이외에 has-a 관계도 상속으로 표현 가능하다.
- has-a 관계 : "하위 클래스 has a 상위 클래스"가 True인 경우
- 그러나 has-a 관계는 상속보다 포함관계를 유지하는 것이 보다 일반적이다.

상속에서의 생성자
-
생성자는 객체 생성 시, 자신의 클래스에 대한 객체만 생성함
-
자식 클래스에서는 부모의 필드나 멤버 메소드를 사용해야 하기 때문에 부모의 생성자를 호출하여 부모의 객체를 만들어 주어야 함
- 자식 클래스 생성자의 첫 번째 중에 super 키워드를 이용하여 부모의 생성자를 호출
- 명시적으로 부모의 생성자를 호출하지 않는 경우, 자동으로
super();
추가

-
super 키워드를 이용하여 생성자를 명시적으로 호출하는 경우, 반드시 생성자의 첫 번째 줄에 기술되어야한다. 또한 super()
와 this()
를 같이 호출하지 못한다.

-
자식 클래스의 생성자에서 명시적으로 부모의 생성자를 호출하지 않는 경우, 자동으로 super();
를 추가한다. 이 때, 부모 클래스에 기본 생성자가 없으면 에러가 발생한다.

오버라이딩
부모로부터 상속 받은 메소드의 내용을 다시 정의하는 것이다.
- 메소드 오버라이딩의 조건
- 메소드 이름이 같아야 한다.
- 메소드 파라미터의 개수와 데이터 타입이 같아야 한다.
- 메소드의 리턴 타입이 같아야 한다.
- 접근제어자는 부모의 것과 같거나 더 넓은 범위여야 한다.
- 메소드 오버라이딩을 할 수 없는 경우
- 부모 클래스 메소드의 접근 제어자가 private으로 선언되어 있는 경우
- 부모 클래스의 메소드가 final 키워드로 선언되어 있는경우
final
- final 클래스 : 자식 클래스를 만들 수 없음.
- final 메소드 : 자식 클래스에서 오버라이딩 할 수 없음.
- final 변수 : 값을 변경할 수 없음. 상수.
Object Class
- 모든 클래스의 부모 클래스
- 최상위 클래스
- extends 키워드를 사용하지 않는 클래스는 자동으로 extends Object 를 추가
Abstract Class
-
추상(Abstract) 클래스란?
- body가 없는 메소드를 포함한 클래스를 추상클래스라고 함
- Abstract 클래스일 경우 클래스의 선언부에 abstract 키워드를 사용
public abstract class Example {}
-
추상(Abstract) 메소드란?
- 메소드의 몸체({})가 없는 메소드를 추상메소드로 지칭
- 몸체 없는 메소드의 선언부에 abstract 키워드를 사용
public abstract void example();
-
Abstract Class
- 미완성 클래스(abstract 키워드 사용)
- abstract 메소드가 포함 된 클래스 -> 반드시 abstract 클래스
- 자체적으로 객체 생성 불가 -> 반드시 상속 통하여 객체 생성
- 일반적인(Concrete) 메소드, 변수도 포함할 수 있다.
- abstract 메소드가 없어도, abstract 클래스 선언 가능
- 객체 생성은 안되나, 참조 변수 타입으로는 가능하다.
Appliance app = new Radio();
-
추상 클래스의 장점
- 일관된 인터페이스 제공
- 꼭 필요한 기능 강제함(공통적이긴 하나, 자식클래스에서 특수화 되는 기능)