[Java] #19 상속 1 (개념)

febCho·2023년 11월 29일
0

Java

목록 보기
41/53

상속

상속의 구조

상속이란 자식 클래스가(sub class) 전부 구현할 수 없는 기능들을 부모 클래스(super classs)로부터 전달받아 쓰는 것, 일종의 확장을 말한다.

예시를 통해 구조 및 개념에 대해 이해해보자.

1. 개념

package kr.s20.object.extention;

//부모 클래스
class Parent{
	int a = 100;
}

//자식 클래스
class Child extends Parent{
	int b = 200;
}
public class ExtentionMain01 {
	public static void main(String[] args) {
		//객체 선언 및 생성
		Child ch = new Child();
		System.out.println(ch.a);
		System.out.println(ch.b);
	}
}
  1. 상속하는 클래스를 부모 클래스(super class), 상속받고자 하는 클래스를 자식 클래스(sub class)라 칭한다.

  2. 자식 클래스에 extends 키워드와 부모 클래스를 명시하면 상속 관계가 형성된다.
    ex. class Child extends Parent{

  3. 부모 클래스는 자동으로 Object를 상속 받으며, 기본적으로는 생략된다.
    ex. class Parent = class Parent extends Object

  4. 부모 클래스의 메서드와 변수는 상속 관계에 의해 메모리에 업로드되어 자식 클래스에서 호출해 사용 가능하다.

Child ch = new Child();
System.out.println(ch.a);
System.out.println(ch.b);
package kr.s20.object.extention;

//부모 클래스
class People{
	public void eat() {
		System.out.println("식사하다.");
	}
}
//자식 클래스
class Student extends People{
	public void study() {
		System.out.println("공부하다.");
	}
}

public class ExtentionMain02 {
	public static void main(String[] args) {
		Student s = new Student();
		s.eat();
		s.study();
		System.out.println(s.toString());
	}
}
  1. 또한, 부모 클래스가 자동으로 Object를 상속받기에 자식 클래스에서도 Object의 메서드를 사용할 수 있다.
  1. s.eat(); : 부모 클래스인 People의 메서드를 상속 받아서 호출
  2. s.study(); : 자신이 가지고 있는(Student) 메서드 호출
  3. System.out.println(s.toString()); : Object의 메서드를 상속 받아서 호출
출력)
식사하다.
공부하다.
kr.s20.object.extention.Student@28a418fc

이를 그림으로 표현하면 다음과 같다.
상속 구조

package kr.s20.object.extention;

//부모 클래스
class A{
	int x = 100;
	private int y = 200;
	
	public int getY() {
		return y;
	}
}

//자식 클래스
class B extends A{
	int z = 300;
}

public class ExtentionMain03 {
	public static void main(String[] args) {
		B bp = new B();
		System.out.println(bp.x);
		//System.out.println(bp.y);
		System.out.println(bp.getY());
		System.out.println(bp.z);
	}
}
  1. 하지만 접근지정자로 private을 갖는 멤버변수의 경우, 상속 관계여도 자식 클래스에서 직접적으로 호출할 수 없다.
B bp = new B();
System.out.println(bp.x);
//System.out.println(bp.y); → 불가
  1. 따라서 public한 get() 메서드를 만들어(캡슐화) 메서드를 호출, 은닉화된 멤버변수를 사용해야 한다.
public int getY() {
	return y;
}System.out.println(bp.getY());
  1. 반면, protected를 접근지정자로 갖는 멤버변수의 경우, 상속 관계일 때 혹은 같은 패키지일 때만 호출이 가능하다. 아래 예제를 보자.
  • Phone
package kr.s21.object.extention;

public class Phone {
	protected String number;
	protected String model;
	protected String color;
	
	public String getNumber() {
		return number;
	}
	
	public String getModel() {
		return model;
	}
	
	public String getColor() {
		return color;
	}
}
  • SmartPhone
package kr.s21.object.extention;

//자식 클래스
public class SmartPhone extends Phone{
	private String os;
	
	//생성자
	public SmartPhone(String number, String model, String color, String os) {
		this.number = number;
		this.model = model;
		this.color = color;
		this.os = os;
	}
	
	public String getOs() {
		return os;
	}
}
  • FeaturePhone
package kr.s21.object.extention;

public class FeaturePhone extends Phone{
	private int pixel; //사진 화소수
	
	public FeaturePhone(String number, String model, String color, int pixel) {
		this.number = number;
		this.model = model;
		this.color = color;
		this.pixel = pixel;
	}
	public int getPixel() {
		return pixel;
	}
}
  • PhoneMain
package kr.s21.object.extention;

public class PhoneMain {
	public static void main(String[] args) {
		SmartPhone sp
		          = new SmartPhone("010-1234", "A1001", "white", "안드로이드");
		FeaturePhone fp
		          = new FeaturePhone("010-5432", "B1001", "black", 1000);
		
		System.out.println("==========================");
		System.out.println("번호\t\t모델\t색상\t특징(OS/화소수)");
		System.out.print(sp.getNumber() + "\t");
		System.out.print(sp.getModel() + "\t");
		System.out.print(sp.getColor() + "\t");
		System.out.println(sp.getOs());
		
		//그냥 아래와 같이 출력해도 됨.
		//System.out.println(sp.number);
		
		System.out.print(fp.getNumber() + "\t");
		System.out.print(fp.getModel() + "\t");
		System.out.print(fp.getColor() + "\t");
		System.out.println(fp.getPixel());
		
	}
}

1) Phone 클래스를 상속 받은 SmartPhone 클래스는 자신의 멤버 변수인 os와 함께 phone의 protected 변수인 number, model, color를 자신의 멤버 변수인 것처럼 활용한다.
SmartPhone sp = new SmartPhone("010-1234", "A1001", "white", "안드로이드");
2) Phone 클래스를 상속 받은 FeaturePhone 클래스 역시 자신의 멤버 변수인 pixel과 함께 phone의 protected 변수인 number, model, color를 자신의 멤버 변수인 것처럼 활용한다.
FeaturePhone fp = new FeaturePhone("010-5432", "B1001", "black", 1000);

이처럼 '상속 관계'를 활용하면, 자식 클래스에서 공통적으로 구현해야 하는 기능들을 부모 클래스에서 1번만 구현함으로써 코드를 간단히 작성할 수 있는 장점이 있다.

다음 글에서는 상속 관계에서 필수로 알아야 할 메서드 오버라이딩에 대해 알아보겠다.

profile
Done is better than perfect.

0개의 댓글