728x90
반응형
상속 (Inheritance)

 

자바에는 자식 클래스가 부모 클래스의 기능을 그대로 물려 받을 수 있는 상속(Inheritace) 기능이 있다.

class Animal{		// Animal 클래스 정의
	String name;	// 멤버변수 선언

	void setName(String name) {
		this.name = name;
	}
}

class Dog extends Animal{
	// Animal 클래스를 상속하는 Dog 클래스
}

public class TestClass{
	public static void main(String []args) {
	
		Dog dog = new Dog();	// Dog 클래스를 활용한 dog 객체 생성
		dog.setName("Poppy");	// dog 객체는 Animal 클래스를 상속(멤버변수, 메소드 존재)
		System.out.println(dog.name);	// Poppy		
	}	
}

 

클래스 상속을 위해서는 extends 라는 키워드를 사용한다.

이제 Dog 클래스는 Animal 클래스를 상속하게 되었다.

Dog 클래스에 name이라는 객체변수와 setName 이라는 메서드를 만들지 않았지만 Animal 클래스를 상속했기 때문에

예제와 같이 사용이 가능하다.

 


부모 클래스의 기능을 확장

 

이번에는 Dog 클래스에 sleep 메서드를 추가한다. (상속받은 클래스에 추가 메서드 정의)

class Animal{		// Animal 클래스 정의
	String name;	// 멤버변수 선언

	void setName(String name) {
		this.name = name;
	}
}

class Dog extends Animal{
	// Animal 클래스를 상속하는 Dog 클래스
	void sleep() {
		System.out.println(this.name+" zzz");
	}
}

public class TestClass{
	public static void main(String []args) {
	
		Dog dog = new Dog();	// Dog 클래스를 활용한 dog 객체 생성
		dog.setName("Poppy");	// dog 객체는 Animal 클래스를 상속(멤버변수, 메소드 존재)
		System.out.println(dog.name);	// Poppy
		dog.sleep();		// Poppy zzz
	}	
}

 

이제 Dog 클래스는 Animal 클래스보다 좀 더 많은 기능(Sleep 메서드 추가)을 가지게 되었다.

이렇듯 보통 부모 클래스를 상속받은 자식 클래스는 부모 클래스의 기능에 더하여 더 많은 기능을 갖도록 작성한다.

 


IS-A 관계

 

Dog 클래스는 Animal 클래스를 상속받았다.

즉, Dog는 Animal의 하위 개념이라고 할 수 있다.

이런 경우 Dog는 Animal에 포함되기 때문에 "Dog is a Animal"이라고 표현하며 이러한 관계를 IS-A 관계라고 한다.

이런 상속관계에 있을 때 자식 클래스의 객체는 부모클래스의 자료형인 것처럼 사용할 수 있다.

 

즉 다음과 같은 코딩이 가능하다.

Animal dog = new Dog();	// Dog is a Animal

/*
Dog 클래스를 활용하여 객체를 생성하며
객체명은 dog으로 하며 
datatype은 부모클래스인 Animal로 한다.

하지만 Dog 클래스 내부 메서드를 사용하지 못한다.
*/

 

다만 여기서 주의해야할 점은 Dog 객체를 Animal 자료형으로 사용할 경우에는 Dog 클래스에만 존재하는 sleep 메서드를 사용할 수 없다는 점이다. 이런 경우에는 Animal 클래스에 구현된 setName 메서드만 사용이 가능하다.

 

하지만 이 반대의 경우, 즉 부모 클래스로 만들어진 객체를 자식 클래스의 자료형으로는 사용할 수 없다.

다음의 코드는 Compile Error가 발생한다.

Dog dog = new Animal();

/*

Animal 클래스를 활용하여
dog 이라는 객체를 생성하는데
그 datatype을 자식클래스로 설정할 수 없다.

*/

 

이는 개념적으로 살펴보아도 코드가 성립될 수 없다.

 

Object 클래스

자바에서 만드는 모든 클래스는 Object 클래스를 상속받는다.
사실 우리가 만든 Animal 클래스는 다음과 기능적으로 완전히 동일하다.
하지만 굳이 아래 코드처럼 Object 클래스를 상속하도록 코딩하지 않아도
자바에서 만들어지는 모든 클래스는 Object 클래스를 자동으로 상속받게끔 되어 있다.
class Animal extends Object{
	String name;
	
	void setName(String name) {
		this.name = name;
	}
}


따라서 자바에서 만드는 모든 객체는 Object 자료형으로 사용할 수 있다.
즉, 다음과 같이 코딩하는 것이 가능하다.

Object animal = new Animal();
Object dog = new Dog();​

 


메서드 오버라이딩 (Method Overriding)

 

이번에는 Dog 클래스를 더 구체화 시키는 HouseDog 클래스를 만들어 보자.

HouseDog 클래스는 Dog 클래스를 상속하여 다음과 같이 만들 수 있다.

 

class Animal{
	String name;
	
	void setName(String name) {
		this.name = name;
	}
}

class Dog extends Animal{
	void sleep() {
		System.out.println(this.name+" zzz");
	}
}

class HouseDog extends Dog{
	// 이중 상속 Animal→Dog→HouseDog
	void sleep() {
		// 상속받은 Dog 클래스 내 sleep 메서드를 오버라이딩
		// 메서드명은 같지만 따르는 것은 해당 클래스 내부 것을 따른다.
		// 덮어씌우기
		System.out.println(this.name+" zzz in house");
	}
}

public class TestClass{
	public static void main(String []args) {
	
		HouseDog houseDog = new HouseDog();
		houseDog.setName("happy");	// happy
		// Dog 클래스의 sleep 메서드가 아닌
		// 상속받은 HouseDog 클래스의 sleep 메서드를 따라 출력
		houseDog.sleep();			// zzz in house.
	}	
}

 

HouseDog 클래스에 Dog 클래스와 동일한 형태(입출력이 동일)의 sleep 메서드를 구현하면

HouseDog 클래스의 sleep 메서드가 Dog 클래스의 sleep 메서드보다 더 높은 우선순위를 갖게되어

HouseDog 클래스의 sleep 메서드가 호출되게 된다.

 

이렇게 부모클래스의 메서드를 자식 클래스가 동일한 형태로 또 다시 구현하는 행위를

메서드 오버라이딩(Method Overriding) 이라고 한다. 

 


메서드 오버로딩 (Method Overloading)

 

이번에는 HouseDog 클래스에 다음과 같은 메서드를 추가한다. (*변경이 아닌 추가)

class Animal{
	String name;
	
	void setName(String name) {
		this.name = name;
	}
}

class Dog extends Animal{
	void sleep() {
		System.out.println(this.name+" zzz");
	}
}

class HouseDog extends Dog{
	void sleep() {
		System.out.println(this.name+" zzz in house");
	}
	
	// HouseDog 클래스 내
	// 두개의 메서드가 존재(메서드명 동일)
	// 차이점은 parameter 에 따라 다르다.
	void sleep(int hour) {
		System.out.println(this.name + " zzz in house for " + hour + " hours");
	}
}

public class TestClass{
	public static void main(String []args) {
	
		HouseDog houseDog = new HouseDog();
		houseDog.setName("happy");	// happy
		houseDog.sleep();			// zzz in house.
		// 해당되는 argument 입력시 해당되는 메서드 적용 후 출력
		houseDog.sleep(3);			// zzz in house for 3 hours.
	}	
}

 


다중 상속

 

다중 상속은 클래스가 동시에 하나 이상의 클래스를 상속받는 것을 뜻한다.

C++, Python 등 많은 언어들이 다중 상속을 지원하지만 자바는 다중 상속을 지원하지 않는다.

728x90
반응형

'Language > Java' 카테고리의 다른 글

Java - Interface  (0) 2023.03.26
Java - Constructor  (0) 2023.03.26
Java - Call by value  (0) 2023.03.25
Java - Class & Method  (0) 2023.03.25
Java - Object Oriented Programming  (0) 2023.03.25

+ Recent posts