๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Java

[JAVA] ์ƒ์†

by ๋Œ€๋ณต2 2024. 7. 17.

 

์ƒ์†

- ๊ธฐ์กด(์ƒ์œ„) ํด๋ž˜์Šค์˜ ์ž์‚ฐ(๋ฉค๋ฒ„)์„ ์ž์‹(ํ•˜์œ„) ํด๋ž˜์Šค์—์„œ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

- extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œ๊ธฐํ•œ๋‹ค.

- ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์กฐ์ƒ ํด๋ž˜์Šค๋Š” Object์ด๋‹ค.

 

 

ํ•ด๋‹น ๊ทธ๋ฆผ์„ ๋ณด๋ฉด SpiderMan์ด๋ผ๋Š” ํด๋ž˜์Šค์— extends๋ฅผ ์ถ”๊ฐ€ํ•ด Person์˜ ์ƒ์† ํด๋ž˜์Šค๋กœ ์ •์˜ํ•˜์˜€๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด SpiderMan๋„ Person์˜ ๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ์ธ name, jump(), eat()๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

 

 

 

์ƒ์†์˜ ์œ ์˜์ 

- ์ž๋ฐ”์—์„œ๋Š” ์ž์‹ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๊ฒŒ ๋˜๋ฉด ์ž์‹๋ถ€ํ„ฐ ์œ„์˜ ๋ชจ๋“  ๋ถ€๋ชจ ํด๋ž˜์Šค๋“ค์ด ๊ฐ™์ด ์˜ฌ๋ผ๊ฐ„๋‹ค.

- ์ž๋ฐ”๊ฐ€ ๋ฌด๊ฒ๋‹ค๋Š” ๋ง์ด ๋‚˜์˜ค๊ฒŒ ๋œ ์ค‘์š” ํฌ์ธํŠธ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

- ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธ ํ›„, ์ž์‹ ํด๋ž˜์Šค๋ฅผ ๋„ฃ์œผ๋ฉด ์ž์‹์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

- ์—ฌ๊ธฐ์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ฒŒ ๋˜๋ฉด ๋ถ€๋ชจ์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ๋‚˜์˜ค์ง€๋งŒ, ๋ฉ”์„œ๋“œ๋Š” ์ž์‹์˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฆ„

- ์ž์‹์ด ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ–ˆ๋‹ค๋ฉด ์ž์‹์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

- ์ž์‹์—๋งŒ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋Š” ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

public class ParentTest {
	public static void main(String[] args) {
		Parent p = new Child();
		Child c = (Child)p; //๊ฐ€๋Šฅ
		System.out.println(p.n);
		p.pr(); // Child์˜ pr์„ ์‹คํ–‰ํ•จ
		p.aa(); // ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ
	}

}
class Parent{
	int n = 10;
	void pr() {
		System.out.println("pr" + n);
	}
}
class Child extends Parent{
	int n = 20;
	void pr() {
		//super.pr();  //์ด๊ฒŒ ์žˆ์œผ๋ฉด ๋ถ€๋ชจ์˜ pr์„ ์‹คํ–‰
		System.out.println("ch" + n);
	}
	
	void aa() {
	System.out.println("๋ผ์•ผ์•„์•„์•…");
	}
}

 

 

 

 

 

 

ํฌํ•จ ๊ด€๊ณ„(has a)

- ์ž๋ฐ”๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹จ์ผ ์ƒ์†๋งŒ ์ง€์›ํ•˜๊ธฐ์— ํ•œ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉด ๋‹ค๋ฅธ ํด๋ž˜์Šค๋Š” ์ƒ์†๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.

- ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์†์„ ๋ฐ›๊ณ  ์‹ถ์œผ๋ฉด ํฌํ•จ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค.

- ๋งด๋ฒ„ ๋ณ€์ˆ˜์— ์ƒ์†๋ฐ›๊ธธ ์›ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•จ

- ํ”„๋กœ์ ํŠธ์˜ ํฌ์ปค์Šค์— ๋งž์ถฐ์„œ ์œ ๋™์ ์œผ๋กœ ์ƒ์†๊ณผ ํฌํ•จ์„ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

* ex) is a ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค๋ฉด ์ƒ์†, has a ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค๋ฉด ํฌํ•จ ๊ด€๊ณ„๋กœ ์ •์˜

 

 

 

 

 

์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)

- ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์ ํ•ฉํ•˜๊ฒŒ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

- ์ž์‹ ํด๋ž˜์Šค์—์„œ ์ด๋ฆ„์ด ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ์ž์‹ ํด๋ž˜์Šค๋งŒ์˜ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

- ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์•„๋„ ๋œ๋‹ค๋Š” ์ ์—์„œ ์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ์˜ ์ฐจ์ด์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

์˜ค๋ฒ„๋ผ์ด๋”ฉ์˜ ์กฐ๊ฑด

1. ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์™€ ์ด๋ฆ„์ด ๊ฐ™์•„์•ผ ํ•จ

2. ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜, ํƒ€์ž…, ์ˆœ์„œ๊ฐ€ ๋™์ผํ•ด์•ผ ํ•จ

3. ๋ฆฌํ„ด ํƒ€์ž„๋„ ๊ฐ™์•„์•ผ ํ•จ

4. ์ ‘๊ทผ ์ œํ•œ์ž๋Š” ๋ถ€๋ชจ๋ณด๋‹ค ๋ฒ”์œ„๊ฐ€ ๋„“๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•จ

5. ์กฐ์ƒ๋ณด๋‹ค ๋” ํฐ ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ์ˆ˜ ์—†์Œ

 

 

 

 

 

Super

- super. ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋กœ ๋ถ€๋ชจ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

- ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ์ ์ธ ์กฐํšŒ ์ˆœ์„œ๋Š” ๋งค์จ๋“œ ๋‚ด -> ์ž์‹ ๋งด๋ฒ„ -> ๋ถ€๋ชจ ๋งด๋ฒ„ -> ๋ถ€๋ชจ์˜ ๋ถ€๋ชจ ->...

- super(): ๋ถ€๋ชจ์˜ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž

- super()๋Š” ์ž์‹ ํด๋ž˜์Šค ์ƒ์„ฑ์ž์˜ ๋งจ ์ฒซ ์ค„์—์„œ๋งŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅ

 

 

 

 

 

 

 

์ œํ•œ์ž

- ํด๋ž˜์Šค, ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ ์„ ์–ธ๋ถ€์— ๋ถ€๊ฐ€์ ์ธ ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•œ๋‹ค.

- ์ ‘๊ทผ ์ œํ•œ์ž: ๋ณ€์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ ์ ‘๊ทผ์— ์ œํ•œ์„ ๋‘”๋‹ค.

  * public, protected(๋‹ค๋ฅธ pkg์—ฌ๋„ ์ƒ์†๊ด€๊ณ„๋ฉด ์ ‘๊ทผ ๊ฐ€๋Šฅ), (default=package), private

- static: ๋ฉ”๋ชจ๋ฆฌ์— ๋ฏธ๋ฆฌ ์˜ฌ๋ ค ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ด์ค€๋‹ค.

- final: ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๋” ์ด์ƒ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค.(const๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.)

- abstract: ์ถ”์ƒ์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ

- synchronized: ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”์— ์‚ฌ์šฉ๋˜๋Š” ์ œํ•œ์ž

- ์—ฌ๋Ÿฌ ๋Œ€์ƒ์ž ์‚ฌ์šฉ ๊ฐ€๋Šฅ(static final num;) ๋‹จ, ์ ‘๊ทผ ์ œํ•œ์ž๋Š” ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ํ•˜๋‹ค.

- ํ™œ์šฉ๋„: private ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด ์ƒ์„ฑ์„ ์ œํ•œ ๊ฑธ๊ณ โ€ฆstatic์ฒ˜๋ฆฌํ•˜๋ฉด ์‹ฑ๊ธ€ํ†ค ๋””์ž์ธ ํŒจํ„ด์œผ๋กœ ์‚ฌ์šฉ

=> getInstance๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœ -> public์€ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ๊ทœ์น™์ด๋‹ค.                

                                             

 

 

 

 

 

Sealed Class

- ํŠน์ • ํด๋ž˜์Šค์—๊ฒŒ๋งŒ ์ƒ์†์ด ๋˜๊ฒŒ๋” ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ‚ค์›Œ๋“œ๋‹ค.

- sealed: ๋ด‰์ธ๋œ ํด๋ž˜์Šค๋กœ permits (ํ•˜์œ„ ํด๋ž˜์Šค 1), (ํ•˜์œ„ ํด๋ž˜์Šค 2),... ๋ฅผ ์ž…๋ ฅํ•ด์ค˜์•ผ ํ•œ๋‹ค.

- final: ๋” ์ด์ƒ ์ƒ์†์„ ํ•  ์ˆ˜ ์—†๋„๋ก ๋งŒ๋“  ํด๋ž˜์Šค๋‹ค.

- non-sealed: ๋ด‰์ธ์ด ํ•ด์ œ๋œ ํด๋ž˜์Šค๋กœ ์ž์œ ๋กœ์šด ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

// Animal.java
public sealed class Animal permits Cat, Dog {}
...

// Cat.java
// permits ๋กœ ์„ ์–ธ๋œ class ๋“ค (Scottishfold , Ragdoll) ๋งŒ์ด Cat class ๋ฅผ ์ƒ์†ํ•  ์ˆ˜ ์žˆ๋‹ค.
public sealed class Cat extends Animal permits Scottishfold, Ragdoll {}
...

// Dog.java
// non-sealed ๋กœ ์„ ์–ธ๋œ Dog ๋Š” ์–ด๋–ค class ๋“ ์ง€ ์ƒ์† ํ•  ์ˆ˜ ์žˆ๋‹ค.
public non-sealed class Dog extends Animal {}



// Cat ๋ฅผ ์ƒ์† ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋Š” Scottishfold , Ragdoll ๋ฟ์ด๋‹ค.
public final class Scottishfold extends Cat {}
public final class Ragdoll extends Cat {}
// Scottishfold์™€ Ragdoll ๋Š” final ๋กœ ์„ ์–ธ๋œ class ๋“ค์ด๊ธฐ ๋•Œ๋ฌธ์—,
// ์–ด๋– ํ•œ class ๋„ ์ด ๋‘˜์„ ์ƒ์† ํ•  ์ˆ˜ ์—†๋‹ค.


public class Bug extends Animal {} // ์ƒ์† ๋ถˆ๊ฐ€๋Šฅ, ์—๋Ÿฌ
public class Bug extends Ragdoll {} // ์ƒ์† ๋ถˆ๊ฐ€๋Šฅ, ์—๋Ÿฌ
//
public class poodle extends Dog {} // ์ƒ์† ๊ฐ€๋Šฅ

 

'Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JAVA] ๋‹คํ˜•์„ฑ  (2) 2024.07.18
[JAVA] ์ฝ”๋“œ ์™ธ ์ž‘์„ฑํ•  ๊ฒƒ๋“ค  (0) 2024.07.17
[JAVA] ๊ฐ์ฒด  (0) 2024.07.16
[JAVA] ์ž๋ฃŒ๊ตฌ์กฐ  (0) 2024.07.15
[JAVA] ๋ณ€์ˆ˜  (0) 2024.07.15