컴퓨터/Java
객체지향 프로그래밍의 가장 기본적인 개념인 상속을 알아보도록 합니다. 간단하게 말해서 어떠한 클래스에게 다른 클래스의 개념을 포함하고 싶을 때 사용하는 개념입니다.
여기서 기준이 되는 클래스 즉, 다른 클래스의 개념을 포함할 기준점을 상속받는 클래스라 하여 하위 클래스, 자식 클래스라 하며 클래스의 개념을 주는, 즉 가지 고올 상속을 해줘야 되는 클래스는 상위 클래스 , 부모 클래스라고 합니다.
그림처럼 상속을 받아 클래스를 만들 수 있습니다. 물론 상속을 받지 않고 오른쪽처럼 모든 정의 내용을 써서 클래스를 만들 수도 있습니다. 하지만 왼쪽 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를 사용함으로써 명확하게 정의하여 객체들을 컨트롤할 수 있습니다. 위의 소스코드 같은 경우 각각의 생성자에 인자로 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개가 존재하게 됩니다.
이런경우 정확한 위치를 정의해 주어야만 원하는 결과를 얻을 수 있습니다.
// 부모 클래스
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();
}
}
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 |
91년생 공학엔지니어의 개발일지
TODAY :
YESTER DAY :
TOTAL :
Commnet