본문 바로가기
Programming 기초/Java

[Java] 상속

by 뭉제 2023. 4. 14.
목차
1. 상속
2. 자식 클래스에 기능 추가
3. 업캐스팅

 

 

2개의 클래스를 만들 때 한 클래스가 다른 클래스의 기능들을 모두 포함하는 형태라면 어떻게 해야할까?

모두 복사해서 만들어야 할까?

 

class Cal{
	public int sum(int n, int m) {
		return n+m;
	}
}

class Cal2{
	public int sum(int n, int m) {
		return n+m;
	}
	
	public int sub(int n, int m) {
		return n-m;
	}
}

public class InheritanceApp {
	public static void main(String[] args) {
		Cal c=new Cal();
		System.out.println(c.sum(2, 1));
	}
}

· Cal 클래스에는 덧셈을 하는 sum 메소드가 있다.

· Cal에서 뺄셈 기능을 추가한 Cal2 클래스는 Cal의 sum 메소드를 그대로 복사

  -> 코드의 양이 많아지고, 코드의 양이 많아수록 둘의 관계를 파악하기가 어려워진다,

  -> Cal의 sum 메소드를 수정하더라도 Cal2의 sum 메소드에는 어떤 영향도 끼치지 않는다.

 

=> 상속 이용

 

 

상속


클래스를 상속해서 새로운 클래스를 생성하면 기존 클래스의 모든 변수와 메소드들이 새로운 클래스에 포함되고, 기존의 변수와 메소드를 덮어쓰거나, 새로운 변수와 메소드를 추가할 수도 있다.

 

 

[선언]

· extends 키워드 사용 

class 자식클래스 extends 부모클래스 { //부모클래스를 상속받는 자식클래스 선언
}

 

[특징]

· 클래스의 다중 상속 불가

· 상속의 횟수에 제한X

· 계층 구조 최상위에 java.lang.Object 클래스 존재

 

 

프로그램에 상속을 이용해 본다.

class Cal {
	public int sum(int n, int m) {
		return n+m;
	}
}

class Cal3 extends Cal { // Cal을 상속받는 클래스 Cal3 선언
}

public class InheritanceApp {
	public static void main(String[] args) {
		Cal c=new Cal();
		System.out.println(c.sum(2, 1));
        
		Cal3 c3=new Cal3();
		System.out.println(c3.sum(2, 1));
	}
}

· 자식 클래스에서 부모 클래스의 private를 제외한 모든 멤버 접근 가능

· c3는 Cal3 클래스와 Cal 클래스의 변수와 메소드를 모두 가진다.

-> Cal3 클래스에 아무것도 없어도, Cal에 있는 메소드인 sum을 사용 가능

 

 

 

자식 클래스에 기능 추가하기


 

자식 클래스에 새로운 기능을 추가하기 위해서 어떻게 해야할까?

 

부모 클래스에 없는 기능 추가 

· 변수나 메소드 새로 정의

class Cal {
	public int sum(int n, int m) {
		return n+m;
	}
}

class Cal3 extends Cal {
	public int sub(int n, int m) {
		return n-m;
	}
}

public class InheritanceApp {
	public static void main(String[] args) {
		Cal c=new Cal();
		System.out.println(c.sum(2, 1));
		
		Cal3 c3=new Cal3();
		System.out.println(c3.sum(2, 1));
		System.out.println(c3.sub(2, 1));
	}
}

· 자식 클래스에 뺄셈 기능을 추가하기 위해 새로 메소드 정의

 

부모 클래스가 가진 기능 확장

· 같은 이름으로 다시 재정의(override)

class Cal3 extends Cal{
	//overriding
	public int sum(int n, int m) {
		System.out.println("Cal3!!");
		return n+m;
	}
	
	public int sub(int n, int m) {
		return n-m;
	}
}

 

 

<참고> 이클립스의 기능으로 재정의

· 자식 클래스 내 우클릭 -> Source -> Override/Implement Method 클릭

 

· 재정의할 메소드 선택하고 OK 클릭

 

· sum 메소드 생성  

 

 

업캐스팅


캐스팅은 타입 변환을 말하며, 자바에서 클래스에 대한 캐스팅은 업캐스팅과 다운캐스팅으로 나뉜다.

업캐스팅(upcasting)

· 자식 클래스의 객체를 부모 클래스 타입으로 변환

· 부모 클래스 타입의 변수로 자식 클래스의 객체를 가리킨다.

 

Cal c=new Cal3(2, 1);
System.out.println(c.sum());
// System.out.println(c.sub()); Error

· Cal 타입의 변수 c가 Cal3 객체를 가리킨다. -> Cal3 객체는 Cal 타입의 객체로 취급

· c는 Cal 클래스의 멤버만 접근 가능

· sub 메소드는 Cal3 클래스의 멤버 -> 오류 발생 

 

=> 업캐스팅한 변수로는 부모 클래스의 멤버만 접근할 수 있다.

 

 

'Programming 기초 > Java' 카테고리의 다른 글

[Java] super와 생성자  (0) 2023.04.20
[Java] overloading vs overriding  (0) 2023.04.17
[Java] 생성자와 this  (0) 2023.04.11
[Java] 클래스와 인스턴스 - 활용  (0) 2023.04.08
[Java] 인스턴스  (0) 2023.04.05

댓글