본문 바로가기

Programming/Java

DAY 1. [JAVA] 상속(Inheritance) / 포함(Composite)

기존의 클래스로 새로운 클래스를 작성하는 것 (== 코드의 재사용)

두 클래스를 부모와 자식으로 관계를 맺어주는 것

class 자식 클래스

extends

부모클래스 { ... }

자손은 조상의 모든 멤버을 상속 받는다. (생성자, 초기화 블럭 제외)

자손의 멤버 개수는 조상보다 적을 수 없다 == 같거나 많다.

자손의 변경은 조상에 영향을 미치지 않는다.

 

class Tv{
	boolean power;   // 전원상태(on/off)
	int channel;     // 채널

	void power()            {   power = !power;   }
	void channelUp()        {   ++channel;        }
	void channelDown()      {   --channel;        }
}

-> 부모 클래스 멤버 5개

class SmartTv extends Tv {      // SmartTv는 Tv에 캡션(자막)을 보여주는 기능 추가
	boolean caption;      // 캡션 상태(on/off)
	void displayCaption(String text) {
		if (caption) {      // 캡션 상태가 on(true)일 때만 text를 보여준다.
				System.out.println(text);
		}
	}
}
-> 자식 클래스 멤버 2개 (상속까지 도합 멤버 7개)

class Ex7_1{
	public static void main(String args[]){
			SmartTv stv = new SmartTv();
			stv.channel = 10;                    // 조상클래스로부터 상속받은 멤버
			stv.channelUp();                     // 조상클래스로부터 상속받은 멤버
			System.out.println(stv.channel);
			stv.displayCaption("Hello, World");
			stv.caption = true;                  // 캡션(자막) 기능을 켠다.
			stv.displayCaption("Hello, world");
	}
}

 

포함 관계

포함(composite)?

클래스의 멤버로 참조변수를 선언하는 것

 

단일 상속

Java는 단일 상속 = 하나의 부모만 상속 받을 수 있다. 만을 허용한다. (C++은 다중상속 허용)

비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.

 

Object클래스 - 모든 클래스의 조상

부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다.

모든 클래스는 Object 클래스에 정의된 11개의 메서드를 상속받는다.

→ toStirng(), equals(Objdect obj), hashCode(), ...

 

오버라이딩

상속받은 조상의 메서드를 자신에 맞게 변경하는 것 (내용==구현부.{ }만 변경 가능, 선언부 변경불가)

class MyPoint3{
		int x;
		int y;
		String getLocation(){
				return "x:"+x+", y:"+y;
		}
}

class MyPoint3D extends MyPoint3 {
		int z;
		// 조상의 getLocation()을 오버라이딩
		String getLocation()
				return "x:"+x+", y:"+y+", z:"+z;
		}
}

public class OverrideTest {
		public static void main(String[] args){
			MyPoint3D p = new MyPoint3D();
			p.x = 3;
			p.y = 5;
			p.z = 7;
			System.out.println(p.getLocation());		
		}
}

오버라이딩의 조건

  1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
  1. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  1. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

 

오버로딩 vs 오버라이딩

오버로딩

== 기존에 없는 새로운 메서드를 정의하는 것(new)

오버라이딩

== 상속받은 메서드의 내용을 변경하는 것(change, modify)