객체지향언어는 기존의 프로그래밍언어에 몇 가지 새로운 규칙을 추가한 보다 발전된 형태의 것이다. 이러한 규칙들을 이용해서 코드 간에 서로 관계를 맺어 줌으로써 보다 유기적으로 프로그램을 구성하는 것이 가능해졌다.
- 객체지향 언어의 특징
- 코드의
재사용성
이 높다.
새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.- 코드의
관리
가 용이하다.
코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.신뢰성
이 높은 프로그래밍을 가능하게 한다.
제어자와 메소드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하여 코드의 중복을 줄여서 코드의 불일치로 인한 오류를 방지할 수 있다.
부품에 해당되는 객체들을 먼저 만들고 하나씩 조립해서 완성된 소프트웨어를 만드는 기법
extends
키워드 뒤에는 하나의 부모 클래스만 와야한다.
class SuperCar extends Car {
→ 이 상태는 Car을 상속해줄게 라는 약속만 한 상태
아직 빈 필드만 가지고 있음
class A {
A의 필드
}
class B extends A {
B의 필드
}
B b = new B();
b 객체는 실제로는 A의 필드와 B의 필드 둘 다 가지고 있다.
A : 부모 클래스, 상위 클래스, 슈퍼 클래스, 기반 클래스
B : 자식 클래스, 하위 클래스, 서브 클래스, 파생 클래스
※ 부모 클래스
※ 자식 클래스
자식 클래스의 생성자 호출 시 일어나는 일
자식 클래스의 객체는 자식 생성자를 호출하여
객체화
를 진행한다.
자식 생성자를 호출했으므로 자식 클래스의 필드가메모리
에 올라갈 것이다.메모리에 자식 클래스의 필드만 올라갔다면 자식 객체로 절대 부모 클래스에 있는 필드에 접근할 수 없다. 따라서 자식 생성자를 호출하게 되면 자식 클래스가 상속받기로 약속되어 있는 부모 클래스의 생성자가 자동으로 먼저 호출이 된다. 그 이후에 자식 클래스의 필드가 부모 클래스의 필드에 이어붙어서 객체의 필드가 완성되게 된다. 따라서 자식 클래스로 만든 객체는 부모 필드가 먼저 메모리에 생성되어 있기 때문에 가능해진다.
→ 자식 생성자의 첫 줄에는 항상 super클래스의 생성자가 호출된다.
명시적으로 적지 않을시에는 보이진 않지만 super() 호출 = 부모의 기본 생성자를 호출
단축키 :
Alt + Shift + s → c : 부모 클래스의 생성자 받아와서 생성자 만들기
Alt + Shift + s → o : 자신이 만든 인스턴스 변수(필드)를 토대로 생성자를 만듬
// 첫번째 // 상속을 위해서 만든 것 // 맥주 상위(부모)클래스 public class Beer { String type; String model; public Beer(String type, String model) { this.type = type; this.model = model; } public void drink() { System.out.println("마십니다."); } public void mix() { System.out.println("섞습니다."); } // 하위 클래스에서 사용하기 위해 Get도 만들어준다. public String getType() { return type; } public String getModel() { return model; }
// 두번째
// 하위(자식) 클래스
public class Hoegaarden extends Beer {
// 필드 입력
String flavor;
int ABV = 6;Hoegaarden(String model, String flavor) { super("밀 맥주", model); this.model = model; // model은 상위 Beer 클래스로부터 상속받음 this.flavor = flavor; } Hoegaarden(String model, String flavor, int ABV) { super("밀맥주", model); this.model = model; // model은 상위 Beer 클래스로부터 상속받음 this.flavor = flavor; this.ABV = ABV; } // 메소드 입력 public void flavorDrink() { System.out.println(model + "맥주의 "+flavor+ "맛을 마십니다."); } // Getter public String getFlavor() { return flavor; } public int getABV() { return ABV; }
}
public class HoegaarenBeerExample {
// 3번째 상속 출력하기 public static void main(String[] args) { // 호가든 맥주 레몬맛 객체 생성하기 Hoegaarden holemon = new Hoegaarden("호가든","레몬", 3); // Beer 클래스로 부터 상속받은 필드 System.out.println("타입 : " + holemon.getType()); System.out.println("알콜 도수 : "+ holemon.getABV()); // Hoegaarden 클래스로부터 상속받은 필드 System.out.println("맛 : " + holemon.getFlavor()); // Hoegaarden 클래스 메서드 호출 holemon.flavorDrink(); }
}