Java - class의 상속의 개념(extends)

컴퓨터/Java

728x90
반응형

Class를 이어주는 상속의 개념

객체지향 프로그래밍의 가장 기본적인 개념인 상속을 알아보도록 합니다. 간단하게 말해서 어떠한 클래스에게 다른 클래스의 개념을 포함하고 싶을 때 사용하는 개념입니다. 

여기서 기준이 되는 클래스 즉, 다른 클래스의 개념을 포함할 기준점을 상속받는 클래스라 하여 하위 클래스, 자식 클래스라 하며  클래스의 개념을 주는, 즉 가지 고올 상속을 해줘야 되는 클래스는 상위 클래스 , 부모 클래스라고 합니다.

 

그림처럼 상속을 받아 클래스를 만들 수 있습니다. 물론 상속을 받지 않고 오른쪽처럼 모든 정의 내용을 써서 클래스를 만들 수도 있습니다. 하지만 왼쪽 a클래스의 정의 부분이 다양한 클래스에서 공통적으로 사용한다면 상속을 받아 클래스를 정의하는 것이 더 효율적 일 것입니다. 물론 상속의 다른 장점도 있지만 자세한 내용은 추후에 다루도록 하겠습니다.

 

상속을 사용하여 클래스 만들기

상속을 사용하기 위해서는 extends라는 키워를 사용합니다. 상속받은 자식 클래스는 부모클래스의 멤버 변수와 메서드를 사용할 수 있습니다. 단, 접근 제한자의 설정에 따라 상속을 제한할 수 있습니다.

// Human 클래스 정의 (부모 클래스가 될 대상)
class Human
{
	public int age;
	String name;
}

// Human 클래스를 상속받은 Man 클래스 (자식 클래스1)
class Man extends Human{
	Man(String name,int age)
	{
		super.name = name;
		super.age = age;
	}
	void manfunc()
	{
		System.out.println(name+"는 남자 입니다.");
	}
}
// Human 클래스를 상속받은 Woman 클래스 (자식 클래스2)
class Woman extends Human
{
	Woman(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	void womanfunc()
	{
		System.out.println(name+"는 여자 입니다.");
	}
}

이런 식으로 상속을 받아 자식 클래스에서는 이름과 나이를 정의하지 않았지만 상속을 받아 사용할 수 있게 되고 

각각 공통된 부분을 제외한 영역은 각각의 자식클래스 영역에서 따로 구현하여 사용할 수 있게 됩니다.

 

this와 super  

this와 super 키워드의 의미를 알아두어야 객체지향 개념의 클래스를 다루기 쉽습니다. 두 가지 개념을 정리하자면 아래와 같습니다.

  • this - 자기 자신을 가르키는 개념으로, 자신이 가지고 있는 멤버 변수 또는 메서드에 접근하고 싶을 때.
  • super - 부모클래스를 가리키는 개념으로, 부모 클래스가 가지고 있는 멤버 변수 또는 메서드에 접근하고 싶을 때

이런 this와 super를 사용함으로써 명확하게 정의하여 객체들을 컨트롤할 수 있습니다. 위의 소스코드 같은 경우 각각의 생성자에 인자로 name과 age가 들어옵니다. 이는 각각의 클래스가 가지고 있는 name과 age와 이름이 동일합니다 이런 경우 프로그램에서 정확이 어디의 값인지 정의하기 위해서 this와 super를 사용합니다. 

위의 두 소스코드에서 this와 super를 사용해도 큰 변화가 없지만 다음과 같은 경우에는 문제가 발생할 수 있습니다.

class Man extends Human{
	
	String name;
	
	Man(String name,int age)
	{
		super.name = name;
		super.age = age;
	}
	void manfunc()
	{
		System.out.println(this.name+"는 남자 입니다.");
	}
}

이런 식으로 부모 클래스에도 name이 있고 자식 클래스에도 name이 있는 경우 이 자식 클래스 Man에는 name이 2개가 존재하게 됩니다.

  • super.name
  • this.name

이런경우 정확한 위치를 정의해 주어야만 원하는 결과를 얻을 수 있습니다.

 

최종 예제 소스코드

// 부모 클래스 
class Human
{
	public int age;
	String name;
}

class Man extends Human{
	
	String name;
	
	Man(String name,int age)
	{
		super.name = name;
		super.age = age;
	}
	void manfunc()
	{
		System.out.println(this.name+"는 남자 입니다.");
	}
}
class Woman extends Human
{
	Woman(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	void womanfunc()
	{
		System.out.println(this.name+"는 여자 입니다.");
	}
}


public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Man man  = new Man("김모군",20);
		Woman woman  = new Woman("윤모양",22);
		
		man.manfunc();
		woman.womanfunc();
	}

}
728x90
반응형

'컴퓨터 > Java' 카테고리의 다른 글

Java - 얕은 복사와 깊은 복사  (0) 2021.07.21
Java - 오버로딩과 오버라이딩  (0) 2021.07.19
Java - Class 생성자  (0) 2021.07.08
Java - 접근 제한자  (0) 2021.07.07
Java - Class  (0) 2021.07.05

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :