λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ—‚.λŒ€μ™Έν™œλ™/πŸ“.μΉ΄μΉ΄μ˜€ν΄λΌμš°λ“œμŠ€μΏ¨

[JAVA] μžλ°”μ˜ 상속과 좔상 λ©”μ†Œλ“œ

by πŸ’Ύκ³ κ΅¬λ§ˆλ§›νƒ•λ¨Ήκ³ μ‹Άλ‹€ 2023. 12. 15.
728x90

🎱 μžλ°” 상속

μ„œλΈŒν΄λž˜μŠ€(sub class, μžμ‹)λŠ” 슈퍼클래슀(super class, λΆ€λͺ¨)λ₯Ό 선택해, 슈퍼클래슀의 λͺ¨λ“  것을 상속받아 μ‚¬μš©ν•  수 μžˆλŠ” 것이닀. 단 private의 κ²½μš°λŠ” μ‚¬μš©ν•  수 μ—†λ‹€.

 

μ„œλΈŒ 클래슀 μ˜†μ— extends ν‚€μ›Œλ“œμ™€ ν•¨κ»˜ 슈퍼클래슀λͺ…을 μž‘μ„±ν•˜λ©΄ λœλ‹€. ν•˜λ‚˜λ§Œ κ°€λŠ₯(단일 상속)ν•˜λ©°, μŠˆνΌν΄λž˜μŠ€μ˜ κΈ°λŠ₯에 더해 더 λ§Žμ€ κΈ°λŠ₯을 갖도둝 μ„œλΈŒν΄λž˜μŠ€λ₯Ό μž‘μ„±ν•œλ‹€.

λ³€μˆ˜λŠ” private둜 μ„ μ–Έν•˜κ³  getter-setter둜 μ œμ–΄ν•˜λŠ” 것이 μ’‹μ§€λ§Œ μ˜ˆμ‹œλŠ” protected둜 μ„ μ–Έν•΄ κ³΅μœ ν•˜λ„λ‘ ν•˜μ˜€λ‹€.

더보기

✨ μ„œλΈŒν΄λž˜μŠ€μ˜ μƒμ„±μžλŠ” μžλ™μœΌλ‘œ super();을 μ‹€ν–‰ν•΄ 슈퍼 클래슀의 μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ λΆ€λ₯΄κ²Œ λœλ‹€. 
✨기본 μƒμ„±μžκ°€ μ•„λ‹Œ μΈμˆ˜κ°€ μžˆλŠ” μƒμ„±μžλ₯Ό λΆ€λ₯Ό λ•ŒλŠ” super(10,20); μ΄λ ‡κ²Œ μž‘μ„±ν•΄ λΆ€λ₯΄λ©΄ λœλ‹€.

✨ @Override: 메타정보λ₯Ό μ‹œμŠ€ν…œκ³Ό μ‚¬μš©μž(개발자)μ—κ²Œ λͺ¨λ‘ μ „λ‹¬ν•˜κΈ° μœ„ν•΄ @기호λ₯Ό μ‚¬μš©ν•œλ‹€. μ‚­μ œν•˜λ©΄ μ•ˆ λœλ‹€!

 

< μ½”λ“œ μ˜ˆμ‹œ >

더보기

< 슈퍼 클래슀 >

package mycom.dept.upgradeGame;

import java.util.Random;

public class Character {
	protected int x;
	protected int y;
	protected String myshape = "Character";
	
	public Character() {
		Random random = new Random();
		this.x = random.nextInt(800);
		this.y = random.nextInt(600);
	}
	
	public Character(int x, int y) {
		this.x = x;
		this.y = y;
	}
	
	public void display() {
		System.out.println(x + ", " + y + " = " + myshape);
	}
}

 

< μ„œλΈŒ 클래슀 >

package mycom.dept.upgradeGame;

public class Player extends Character {
	
	public Player() {
		this.myshape = "Player";
	}
	
	public Player(int mx, int my) {
		super(mx, my);
		this.myshape = "Player";
	}
	
	@Override
	public void display() {
		System.out.print("*** ");
		super.display();
	}
}

 

🎱 μžλ°” μƒμ†μ˜ νŠΉμ§•

1. μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±: 좔상화, κ³΅ν†΅μ½”λ“œλ₯Ό ν•œ 곳에 두고 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ

2. μ œμ–΄μš©λ„: λͺ¨λ“  μ„œλΈŒν΄λž˜μŠ€λ₯Ό 슈퍼클래슀둜 μ œμ–΄ν•˜κ³  μ‹Άμ–΄μ„œ

 

🎱 ν•¨μˆ˜μ˜ μž¬μ •μ˜(Override)

슈퍼클래슀의 접근방식을 μœ μ§€ν•˜λ©° 각자의 고유 νŠΉμ„±μ„ 갖도둝 μž‘μ„±ν•΄μ•Ό ν•œλ‹€.

슈퍼클래슀의 ν•¨μˆ˜λ₯Ό μ„œλΈŒν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•˜λ©΄ 슈퍼클래슀의 ν•¨μˆ˜λ₯Ό 보이지 μ•ŠλŠ” μƒνƒœλ‘œ λ§Œλ“ λ‹€.

= not visible μƒνƒœλ‘œ 변경됨. κ·Έλž˜μ„œ μž¬μ •μ˜ν•œ 본인의 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” 것이닀.

λ§Œμ•½ 슈퍼클래슀의 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ superλ₯Ό μ‚¬μš©ν•΄μ„œ λΆ€λ₯Ό 수 μžˆλ‹€.

 

🎳 좔상 λ©”μ†Œλ“œ

좔상 λ©”μ†Œλ“œ: κ΅¬ν˜„λΆ€ 없이 머리만, ν‹€λ§Œ μž‘μ„±ν•˜λŠ” 것

상속받은 μ„œλΈŒν΄λž˜μŠ€κ°€ 무쑰건 μž¬μ •μ˜ ν•˜λ„λ‘ ν•˜κΈ° μœ„ν•΄μ„œ μŠˆνΌν΄λž˜μŠ€μ—μ„œ 좔상 λ©”μ†Œλ“œλ₯Ό μž‘μ„±ν•œλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ κ°•μ œμ„±μ΄ λΆ€μ—¬λ˜κΈ° λ•Œλ¬Έμ— λͺ¨λ“  μ„œλΈŒν΄λž˜μŠ€κ°€ 본인만의 좜λ ₯κΈ°λŠ₯을 갖도둝 ν•  수 μžˆλ‹€. (μ•„λž˜ μ˜ˆμ‹œ)

 

μ΄λ ‡κ²Œ ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν΄λž˜μŠ€μ™€ ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό abstractλ₯Ό μž‘μ„±ν•΄μ•Ό ν•œλ‹€. μ•„λž˜μ™€ 같이 Duck을 좔상 클래슀둜 μž‘μ„±ν•˜κ³ , displayλ₯Ό 좔상 λ©”μ†Œλ“œλ₯Ό μž‘μ„±ν•˜μ˜€λ‹€.

 

πŸ€”κ·Έλ ‡λ‹€λ©΄ μΆ”μƒν΄λž˜μŠ€λ₯Ό μ™œ μ‚¬μš©ν•˜λŠ” κ²ƒμΌκΉŒ?

μΆ”μƒν΄λž˜μŠ€λŠ” 상속을 톡해 μ½”λ“œλ₯Ό μž¬μ‚¬μš©μ„ μœ„ν•¨λ„ μžˆμ§€λ§Œ 더 μ€‘μš”ν•œ 것은 μ œμ–΄(μ—…μΊμŠ€νŒ… = ν˜•λ³€ν™˜)λ₯Ό ν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것이닀. 같은 μ΄λ¦„μ˜ κΈ°λŠ₯이라도 본인 고유의 νŠΉμ„±μ„ 가진 κΈ°λŠ₯으둜 λ³€κ²½ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것이닀. 

더보기

κ°€μž₯ ν”ν•œ μ˜ˆμ‹œλ‘œ λ™λ¬Όμ˜ μšΈμŒμ†Œλ¦¬κ°€ μžˆλ‹€. Animal을 μΆ”μƒν΄λž˜μŠ€λ‘œ μ„ μ–Έ, soundλ₯Ό 좔상 λ©”μ†Œλ“œλ‘œ μ„ μ–Έν•œλ‹€λ©΄ 각각의 λ™λ¬Όλ§ˆλ‹€ 본인의 고유 μšΈμŒμ†Œλ¦¬λ‘œ sound λ©”μ†Œλ“œλ₯Ό λ³€κ²½ν•˜μ—¬ μ‚¬μš©ν•  수 있게 λ˜λŠ” 것이닀. 

 

✨ Duck.display()λ₯Ό κ°•μ œμ„±μ„ 띄고 내렀보내(μΆ”μƒλ©”μ†Œλ“œ) ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•˜μ§€ μ•ŠμœΌλ©΄ ν•΄λ‹Ή 였λ₯˜κ°€ λ°œμƒν•˜κ²Œ λœλ‹€.

 

✨ μ΄λ ‡κ²Œ μΆ”μƒν΄λž˜μŠ€λ‘œ μž‘μ„±λœ ν΄λž˜μŠ€λŠ” 객체생성(μΈμŠ€ν„΄μŠ€)이 λΆˆκ°€λŠ₯ν•˜λ‹€. μ™œλƒν•˜λ©΄ 좔상 λ©”μ†Œλ“œλŠ” κ΅¬ν˜„λΆ€κ°€ μ—†μ–΄ λ©”λͺ¨λ¦¬ 할당이 λΆˆκ°€λŠ₯ν•˜λ‹€. 즉, Null인 μƒνƒœμ΄λ‹€. λ§Œμ•½ μΆ”μƒν΄λž˜μŠ€λ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄ 좔상 λ©”μ†Œλ“œμ— μ ‘κ·Όν•  수 있기 λ•Œλ¬Έμ— 였λ₯˜κ°€ λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ 접근을 막은 것이닀. 

 

즉, μΆ”μƒν΄λž˜μŠ€λŠ” μƒμ†μš©μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 것이닀. μΆ”μƒν΄λž˜μŠ€λ₯Ό μ΄μš©ν•˜μ—¬ μ„œλΈŒν΄λž˜μŠ€λ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

 

< μ½”λ“œ μ˜ˆμ‹œ>

더보기

< 슈퍼 클래슀 >

public abstract class Duck {
    protected int x;
    protected int y;
    protected String shape = "Duck";

    public Duck(){
    	Random random = new Random();
    	this.x = random.nextInt(100);
    	this.y = random.nextInt(100);
    }
    
    public Duck(int mx, int my) {
    	this.x = mx;
    	this.y = my;
    }
    
    public abstract void display();
}

 

< μ„œλΈŒ 클래슀 >

package mycom.dept.duck;

public class RedDuck extends Duck {
	
	public RedDuck(){
    	this.shape = "RedDuck";
    }
    
    public RedDuck(int mx, int my) {
    	super(mx, my);
    	this.shape = "RedDuck";
    }

    @Override
    public void display() {
    	System.out.print("RED: ");
    	System.out.println(shape + "=(" + x + "," + y + ")");
    }
}

 

728x90