기타/Java

JAVA(1)

stonesy 2024. 1. 20. 16:18
728x90

πŸ“–Java

πŸ”λ³€μˆ˜

λ³€μˆ˜λŠ” “λ©”λͺ¨λ¦¬ 곡간(그릇)”으둜, λ©”λͺ¨λ¦¬ 곡간에 κ°’(value)을 ν• λ‹Ή(assign)ν•œ ν›„ μ‚¬μš©ν•œλ‹€.

 

βœ”οΈTypeμ΄λž€?

κΈ°λ³Έν˜•(Primitive Type): κ°’ μ €μž₯

미리 정해진 크기의 데이터 ν‘œν˜„μœΌλ‘œ λ³€μˆ˜ μžμ²΄μ— 값을 μ €μž₯ν•œλ‹€.

 

μ°Έμ‘°ν˜•(Reference Type): μ£Όμ†Œ μ €μž₯

크기가 미리 μ •ν•΄μ§ˆ 수 μ—†λŠ” λ°μ΄ν„°μ˜ ν‘œν˜„μœΌλ‘œ, λ³€μˆ˜μ—λŠ” μ‹€μ œ 값을 μ°Έμ‘°ν•  수 μžˆλŠ” μ£Όμ†Œλ§Œ μ €μž₯ν•œλ‹€.

 

μžλ°”λŠ” λ³€μˆ˜μ— λŒ€μž…, 리턴, ν•¨μˆ˜ 인자 값을 μ „λ‹¬ν•˜λŠ” Pass By Valueλ₯Ό μ‚¬μš©ν•œλ‹€.

*Pass By Value: λŒ€μž…, 리턴, ν•¨μˆ˜ 인자 값을 전달할 λ•Œ λ©”λͺ¨λ¦¬μ˜ 값을 μ „λ‹¬ν•˜λŠ” 것

  • κΈ°λ³Έν˜•(Primitive Type): λ©”λͺ¨λ¦¬μ— μ§€μ •λœ μ‹€μ œ 값이 μ „λ‹¬λœλ‹€. ⇒ Pass By Value
  • μ°Έμ‘°ν˜•(Reference Type): λ©”λͺ¨λ¦¬μ— μ €μž₯된 μ°Έμ‘° κ°’(hash code)κ°€ μ „λ‹¬λœλ‹€. ⇒ Pass By Reference

 

βœ”οΈκΈ°λ³Έν˜•μ˜ 크기

8개의 Type

λ…Όλ¦¬ν˜•: boolean

μ •μˆ˜ν˜•: byte, short, int, long

μ‹€μˆ˜ν˜•: float, double

λ¬Έμžν˜•: char

⇒intκ°€ μ •μˆ˜μ˜ default, double이 μ‹€μˆ˜μ˜ default

⇒byteλŠ” 8bit인데 2^7κΉŒμ§€λ§Œ μ²˜λ¦¬ν•˜λŠ” 이유: λΆ€ν˜Έ λ•Œλ¬Έ

 

 

πŸ”ν˜• λ³€ν™˜(Type Casting)

λ³€μˆ˜μ˜ ν˜•μ„ λ‹€λ₯Έ ν˜•μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것

char ↔ int

κΈ°λ³Έν˜•μ€ κΈ°λ³Έν˜•λΌλ¦¬, μ°Έμ‘°ν˜•μ€ μ°Έμ‘°ν˜•λΌλ¦¬ ν˜• λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€.

  • boolean은 λ‹€λ₯Έ κΈ°λ³Έν˜•κ³Ό ν˜Έν™˜λ˜μ§€ μ•ŠμŒ
  • κΈ°λ³Έν˜•κ³Ό μ°Έμ‘°ν˜•μ˜ ν˜• λ³€ν™˜μ„ μœ„ν•΄μ„œ Wrapper 클래슀λ₯Ό μ‚¬μš©ν•œλ‹€.

 

βœ”οΈλͺ…μ‹œμ  ν˜•λ³€ν™˜κ³Ό λ¬΅μ‹œμ  ν˜•λ³€ν™˜

  • λͺ…μ‹œμ 
int i = 300; byte b = (byte)i;
  • λ¬΅μ‹œμ 
byte b = 10; int i = (int)b; int i2 = b;

 

 

κ°’μ˜ 크기, νƒ€μž…μ˜ 크기가 μ•„λ‹Œ νƒ€μž…μ˜ ν‘œν˜„ λ²”μœ„κ°€ μ»€μ§€λŠ” λ°©ν–₯으둜 ν• λ‹Ήν•œ κ²½μš°λŠ” λ¬΅μ‹œμ  ν˜•λ³€ν™˜ λ°œμƒ

byte(8) → short / char(16) → int(32) → long(64) → float(32) → double(64)

char: 2Byte의 μ •μˆ˜(16bit)

  • λͺ…μ‹œμ  ν˜•λ³€ν™˜μ€ κ°’ 손싀이 λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ ν”„λ‘œκ·Έλž˜λ¨Έ μ±…μž„ν•˜μ— ν˜•λ³€ν™˜μ„ μ§„ν–‰ν•œλ‹€.
  • λ¬΅μ‹œμ  ν˜•λ³€ν™˜μ€ 자료의 손싀 걱정이 μ—†μœΌλ―€λ‘œ ν˜•λ³€ν™˜ μ—°μ‚° μƒλž΅ν•œλ‹€.

 

 

πŸ”μ—°μ‚°μžμ™€ ν˜•λ³€ν™˜

1.ν”Όμ—°μ‚°μžμ˜ 크기가 4B μ΄ν•˜λΌλ©΄ intν˜•μœΌλ‘œ ν˜•λ³€ν™˜ ν›„ 연산이 μ§„ν–‰λœλ‹€.

즉, byte, short, char νƒ€μž…μ˜ 경우 intν˜•μœΌλ‘œ ν˜• λ³€ν™˜ ν›„ 연산이 μ§„ν–‰λœλ‹€. 즉, μ•„λž˜μ™€ 같은 μ˜ˆμ‹œμ—μ„œ λͺ…μ‹œμ μΈ ν˜•λ³€ν™˜μ„ ν•„μš”λ‘œ ν•œλ‹€.

byte b1 = 10;
byte b2 = 20;
//byte b3 = b1 + b2;
byte b3 = (byte)(b1+b2);

2. μ‚°μˆ  이항 μ—°μ‚°μžλŠ” μ—°μ‚° 전에 ν”Όμ—°μ‚°μžμ˜ νƒ€μž…μ„ μΌμΉ˜μ‹œν‚€λ©°, ν”Όμ—°μ‚°μž 쀑 큰 νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ ν›„ 연산이 μ§„ν–‰λœλ‹€.

int i1 = 10;
long l1 = 20;
//int i2 = i1 + l1;
int i2 = (int)(i1+l1);

 

βœ”οΈ&,&& 그리고 |,||

&와 |은 λΉ„νŠΈμ—°μ‚°μž, &&와 ||은 λ…Όλ¦¬μ—°μ‚°μžμ΄λ‹€. 각각의 차이점은 λΉ„νŠΈ μ—°μ‚°μžλŠ” λͺ¨λ“  ν”Όμ—°μ‚°μžμ— λŒ€ν•œ 연산을 μˆ˜ν–‰ν•˜κ³ , λ…Όλ¦¬μ—°μ‚°μžλŠ” μ•žμ˜ μ—°μ‚°μœΌλ‘œ κ·Έ κ²°κ³Όκ°€ λͺ…ν™•ν•˜λ©΄ μ΄ν›„μ˜ ν”Όμ—°μ‚°μžμ— λŒ€ν•œ 연산이 이루어지지 μ•ŠλŠ”λ‹€.

//(1)
int a = 10;
int b = 20;
System.out.println((a += 10) > 15 | (b -= 10) > 15);
System.out.println("a = " + a + ", b = " + b); //a=20, b=10

//(2)
a = 10;
b = 20;
System.out.println((a += 10) > 15 || (b -= 10) > 15);
System.out.println("a = " + a + ", b = " + b); //a=20, b=20

λ”°λΌμ„œ μœ„μ˜ μ˜ˆμ œμ—μ„œ (1)번 κ²½μš°μ™€ (2)번 κ²½μš°μ—μ„œ μ—°μ‚°μˆ˜ν–‰ ν›„ a와 bκ°’μ˜ 차이가 λ°œμƒν•œλ‹€. ||의 경우 λ…Όλ¦¬μ—°μ‚°μžμ΄κΈ° λ•Œλ¬Έμ— (a+=10)>15의 μ—°μ‚°μ—μ„œ μ—°μ‚° κ²°κ³Όκ°€ 정해지고 λ”°λΌμ„œ (b-=10)>15의 연산이 μˆ˜ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

 

 

 

πŸ“–κ°μ²΄μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°

μž₯점

  • 블둝 ν˜•νƒœμ˜ λͺ¨λ“ˆν™”λœ ν”„λ‘œκ·Έλž˜λ°
    • μ‹ λ’°μ„± 높은 ν”„λ‘œκ·Έλž˜λ°
    • μΆ”κ°€/μˆ˜μ •/μ‚­μ œ 용이
    • μž¬μ‚¬μš©μ„±

 

객체지ν–₯ μ–Έμ–΄μ˜ νŠΉμ§•

좔상화, λ‹€ν˜•μ„±, 상속, 데이터 은닉과 보호

 

 

πŸ”μΆ”μƒν™”

ν˜„μ‹€μ˜ 객체가 κ°–λŠ” 속성과 κΈ°λŠ₯은 μΆ”μƒν™”λ˜μ–΄ ν΄λž˜μŠ€μ— μ •μ˜λ˜λ©°, ν΄λž˜μŠ€λŠ” κ΅¬μ²΄ν™”λ˜μ–΄ ν”„λ‘œκ·Έλž¨μ˜ 객체가 λœλ‹€.

public class MovieTest{	
	public static void main(String[] args){
		Movie movie;
		movie = new Movie();
		movie.movieId = 1;
		movie.title = "μ˜ν™”μ œλͺ©";
		movie.director = "μ˜ν™”κ°λ…";
	}
}

 

stacks

  • λ©”μ„œλ“œλ“€μ˜ μ‹€ν–‰κ³΅κ°„μœΌλ‘œ, thread λ‹Ή ν•˜λ‚˜μ˜ stack이 μƒμ„±λœλ‹€.

heap

  • 객체λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ μ˜μ—­μœΌλ‘œ, thread에 μ˜ν•΄ κ³΅μœ λœλ‹€.

meta-space

  • 클래슀 정보 처리

 

 

πŸ”μƒμ†

상속은 κΈ°μ‘΄(μƒμœ„)클래슀의 μžμ‚°μ„ μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•œ 것

  • extends ν‚€μ›Œλ“œ μ‚¬μš©ν•œλ‹€.
  • λͺ¨λ“  ν΄λž˜μŠ€λŠ” Object 클래슀λ₯Ό μƒμ†λ°›λŠ”λ‹€.
  • μƒμ„±μžλŠ” 상속이 λΆˆκ°€λŠ₯ν•˜λ‹€.
  • 단, μƒμœ„ 클래슀의 μ ‘κ·Όμ§€μ •μžκ°€ μžμ‹ 클래슀의 μ ‘κ·Ό μ§€μ •μžλ³΄λ‹€ ν¬κ±°λ‚˜ κ°™μ•„μ•Όν•œλ‹€. 예λ₯Ό λ“€μ–΄, λΆ€λͺ¨μ˜ μ ‘κ·Όμ§€μ •μžκ°€ default이고 μžμ‹μ΄ λ‹€λ₯Έ package에 μžˆλ‹€λ©΄ μ ‘κ·Όν•  수 μ—†μœΌλ―€λ‘œ override된 λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ”λ‹€.
  • this()λ‚˜ super()λŠ” μžμ‹ 클래슀 μƒμ„±μžμ˜ 맨 첫 μ€„μ—μ„œλ§Œ ν˜ΈμΆœν•  수 μžˆλ‹€. ⇒ this()와 super()λ₯Ό 같이 μ‚¬μš©ν•  수 μžˆλŠ” 방법은 μ—†λ‹€.
  • μžλ°”λŠ” 객체λ₯Ό μƒμ„±ν•˜λŠ” κ·Έ μ‹œμ μ— 상속이 이루어진닀.
public class Person{
	String name;
	int age;

	void sleep(){...}
	void eat(){...}
}

public class Student extends Person{
	String school;

	void study(){...}
}

❗Java: 단일 상속

JavaλŠ” 단일 μƒμ†λ§Œ μ§€μ›ν•œλ‹€. λŒ€μ‹  interface와 포함 관계(has a)둜 단점을 극볡가λŠ₯ν•˜λ‹€.

  • 닀쀑 μƒμ†μ˜ 경우 μ—¬λŸ¬ 클래슀의 κΈ°λŠ₯을 물렀받을 수 μžˆλ‹€λŠ” μž₯점이 μžˆμœΌλ‚˜ 관계가 맀우 λ³΅μž‘ν•΄μ§€λŠ” 단점이 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, λ™μΌν•œ μ΄λ¦„μ˜ λ©”μ„œλ“œκ°€ 두 μƒμœ„ ν΄λž˜μŠ€μ—κ²Œ λͺ¨λ‘ μžˆλ‹€λ©΄ ν•˜μœ„ ν΄λž˜μŠ€λŠ” μ–΄λ–€ λ©”μ„œλ“œλ₯Ό μ“Έ 것인가?

상속: κ΅¬ν˜„μƒμ†κ³Ό νƒ€μž…μƒμ†

κ΅¬ν˜„μƒμ†: implements ν‚€μ›Œλ“œλ₯Ό 톡해 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속받아 κ΅¬ν˜„

νƒ€μž…μƒμ†: extends ν‚€μ›Œλ“œλ₯Ό 톡해 ν΄λž˜μŠ€κ°€ λ‹€λ₯Έ 클래슀λ₯Ό ν™•μž₯ν•˜λŠ” 것

 

 

πŸ”λ‹€ν˜•μ„±(Polymorphism)

λ°μ΄ν„°μ˜ λ‹€ν˜•μ„±(=ν˜•λ³€ν™˜)

λ°μ΄ν„°μ˜ λ‹€ν˜•μ„±μ€ λ©”μ†Œλ“œμ˜ μ˜€λ²„λ‘œλ”©μ„ 쀄일 수 μžˆλ‹€.

Primitive

byte⇒short/char⇒int⇒long⇒float⇒double

Reference

λͺ¨λ“  sub κ°μ²΄λŠ” super type으둜 μžλ™ ν˜•λ³€ν™˜ 됨

 

λ©”μ„œλ“œμ˜ λ‹€ν˜•μ„±

  • ν˜ΈμΆœμ— λŒ€ν•œ νŽΈλ¦¬μ„± 제곡

μ˜€λ²„λ‘œλ”©κ³Ό μ˜€λ²„λΌμ΄λ”©“λ©”μ†Œλ“œ ν˜ΈμΆœμ— λŒ€ν•œ νŽΈλ¦¬μ„±”

  • λ™μΌν•œ κΈ°λŠ₯에 λŒ€ν•΄ μ—¬λŸ¬ ν˜•νƒœμ˜ ν•¨μˆ˜λ₯Ό μ œκ³΅ν•œλ‹€.
  • λ™μΌν•œ κΈ°λŠ₯일 λ•Œ 같은 μ΄λ¦„μœΌλ‘œ ν˜ΈμΆœν•˜λ―€λ‘œ ν˜ΈμΆœμ— λŒ€ν•œ νŽΈλ¦¬μ„± 제곡

method Overloading : μΈμžμ— 따라 μ—¬λŸ¬ 개의 ν•¨μˆ˜λ₯Ό 제곡, 인자둜 ꡬ별

method Overriding : λΆ€λͺ¨ or μžμ‹μœΌλ‘œ ꡬ별


μƒμ†μ˜ λͺ©μ μ€ “μˆ˜μ •”이 μ μ ˆν•˜λ‹€. μž¬μ‚¬μš©μ΄ λͺ©μ μ΄λΌλ©΄ 상속이 μ•„λ‹ˆλΌ, μ†μ„±μœΌλ‘œ 넣어두고 μ‚¬μš©ν•˜λŠ” 것이 더 효과적일 수 μžˆλ‹€. μ΄λŠ” JavaλŠ” 동적 바인딩을 톡해 λŸ°νƒ€μž„μ— λ©”μ†Œλ“œ ν˜ΈμΆœμ„ λ™μ μœΌλ‘œ κ²°μ •ν•˜λŠ” 것과 관련이 μžˆλ‹€.

 

C++은 linking이 compile time에 이루어지고, virtualμ΄λΌλŠ” ν‚€μ›Œλ“œ μ‚¬μš© μ‹œμ—λ§Œ ν•„μš”ν•œ method의 객체λ₯Ό ν˜ΈμΆœν•œλ‹€. 반면, JavaλŠ” 미리 linking이 μ΄λ£¨μ–΄μ§ˆ 수 μ—†λ‹€.(compile νƒ€μž„μ— linking이 μ΄λ£¨μ–΄μ§ˆ 수 μ—†λ‹€.) 클래슀 load μ‹œμ— static ν•œ λ©”μ„œλ“œκ°€ μžˆλ‹€λ©΄ linking이 이루어지며, κ·Έ μ™Έμ—λŠ” λ©”μ„œλ“œ ν˜ΈμΆœ μ‹œμ— linking이 이루어진닀. 즉, JAVAλŠ” 객체 지ν–₯으둜 μœ„ν•΄ 동적 λ°”인딩을 μ„ νƒν–ˆκΈ° λ•Œλ¬Έμ— μƒλŒ€μ μœΌλ‘œ λŠλ¦¬λ‹€.


 

βœ”οΈλ‹€ν˜•μ„±μ˜ ν™œμš©

λ‹€ν˜•μ„± ν™œμš© 예1-λ‹€λ₯Έ νƒ€μž…μ˜ 객체λ₯Ό λ‹€λ£¨λŠ” λ°°μ—΄

  • ObjectλŠ” λͺ¨λ“  클래슀의 쑰상이닀.

Object 배열은 μ–΄λ–€ νƒ€μž…μ˜ 객체라도 λ‹€ μ €μž₯ν•  수 있음

  • μžλ°”μ˜ 자료 ꡬ쑰λ₯Ό κ°„λ‹¨ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆλ‹€.

이와 같은 νŠΉμ„±μ„ μ΄μš©ν•˜μ—¬ Collection APIκ°€ λ“±μž₯ν•˜κ²Œ 됨

 

예λ₯Όλ“€μ–΄, λ‹€μŒκ³Ό 같은 Object 배열은 μ–΄λ– ν•œ νƒ€μž…μ˜ μžλ£Œλ„ μ €μž₯ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ μƒμœ„ νƒ€μž…μœΌλ‘œ 올라갈수둝 ν™œμš©λ„λŠ” λ†’μ•„μ§€μ§€λ§Œ μ½”λ“œμ˜ λ³΅μž‘μ„±μ΄ 높아진닀.(μ–Έμ œλ‚˜ μΊμŠ€νŒ…μ„ ν•˜κ³  λ“€μ–΄κ°€μ•Ό ν•˜λŠ” 문제점이 μžˆλ‹€.) λ”°λΌμ„œ Java API처럼 곡톡 κΈ°λŠ₯인 경우 Objectλ₯Ό νŒŒλΌλ―Έν„°λ‘œ μ‚¬μš©ν•˜κ² μ§€λ§Œ λ§Žμ€ 경우 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μƒ μ΅œμƒμœ„ 객체λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

Object[] objs = new  Object[4];
objs[0]="Hello";
objs[1]=objs;
objs[2]=new SpiderMan();
objs[3]=3; //auto boxing;
objs[3]=Integer.valueOf(3); //μ •ν™•νžˆλŠ” Wrapper 클래슀의 ν˜•νƒœλ‘œ μ €μž₯λœλ‹€.

 

 

λ‹€ν˜•μ„±μ˜ ν™œμš© 예2 - λ§€κ°œλ³€μˆ˜μ˜ λ‹€ν˜•μ„±

ex) System.out.println(Object x){}

 

βœ”οΈλ‹€ν˜•μ„±κ³Ό μ°Έμ‘°ν˜• 객체의 ν˜• λ³€ν™˜

λ©”λͺ¨λ¦¬μ— μžˆλ”λΌλ„ μ°Έμ‘°ν•˜λŠ” λ³€μˆ˜μ˜ νƒ€μž…μ— 따라 μ ‘κ·Όν•  수 μžˆλŠ” λ‚΄μš©μ΄ μ œν•œλœλ‹€. λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€ μžˆλŠ” 것과 μ‚¬μš©ν•  수 μžˆλŠ” 것은 λ‹€λ₯΄λ‹€.

public class Person{
	String name;
	int age;

	void sleep(){...}
	void eat(){...}
}

public class Student extends Person{
	String school;

	void study(){...}
}

public class StudentTest(){
	public static void main(String[] args){
		Person person = new Person();
		Student student = new Student();
		person = student;
		person.study(); //컴파일 μ—λŸ¬ λ°œμƒ
	}
}

λ³Έ 상황을 “shadow impact”라고 ν•œλ‹€. λ‹€ν˜•μ„±μ„ 톡해 λΆ€λͺ¨ 클래슀 νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ‘œ μžμ‹ 클래슀의 객체λ₯Ό λ‹€λ£° λ•Œ, μ‹€μ œ 객체의 νƒ€μž…μ— 따라 λ™μ μœΌλ‘œ λ©”μ†Œλ“œ 호좜이 κ²°μ •λœλ‹€. 즉, μ‹€μ œ λ©”λͺ¨λ¦¬μ— μžˆμ§€λ§Œ κ°€λ €μ Έ μžˆλŠ” μƒνƒœμ΄λ‹€.

 

βœ”οΈReference ν˜•λ³€ν™˜

Up casting(μžλ™ ν˜•λ³€ν™˜)

sub νƒ€μž…μ—μ„œ super νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ ⇒ λͺ¨λ“  sub νƒ€μž…μ˜ κ°μ²΄λŠ” super νƒ€μž…μœΌλ‘œ μžλ™ ν˜•λ³€ν™˜ λœλ‹€.

Down casting(λͺ…μ‹œμ  ν˜•λ³€ν™˜)

super νƒ€μž…μ—μ„œ sub νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ ⇒ super νƒ€μž…μ΄ μ°Έμ‘° ν•˜κ³  μžˆλŠ” 객체의 νƒ€μž…μœΌλ‘œλ§Œ ν˜•λ³€ν™˜ λœλ‹€.

*μ°Έμ‘°ν•˜κ³  μžˆλŠ” 객체의 νƒ€μž…μ΄ μ•„λ‹Œ λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ν•˜λ©΄ ClassCaseException이 λ°œμƒν•œλ‹€.

*λΆ€λͺ¨λŠ” μžμ‹μ„ ν’ˆμ„ 수 μžˆμ§€λ§Œ, μžμ‹μ€ λΆ€λͺ¨λ₯Ό ν’ˆμ„ 수 μ—†λ‹€.

 

βœ”οΈinstanceof

Reference νƒ€μž…μ— λŒ€ν•œ ν˜•κ²€μ‚¬λ₯Ό μˆ˜ν–‰ν•œλ‹€.

  • ν˜•μ‹] 객체 instanceof Type
  • 객체가 ν•΄λ‹Ή νƒ€μž…μ΄λ©΄ true, ν•΄λ‹Ή νƒ€μž…μ΄ μ•„λ‹ˆλ©΄ false
  • 주의 사항 : ν˜•κ²€μ‚¬ν•  λ•Œμ—λŠ” sub νƒ€μž…λΆ€ν„° 검사해야 ν•œλ‹€.

 

 

 

πŸ“–μΆ”μƒ 클래슀(abstract class)와 μΈν„°νŽ˜μ΄μŠ€(interface)

πŸ”μΆ”μƒ 클래슀

μžμ† ν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ μž¬μ •μ˜ν•΄μ„œ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— μ‘°μƒμ˜ κ΅¬ν˜„μ΄ λ¬΄μ˜λ―Έν•œ λ©”μ„œλ“œλ‘œ, κ΅¬ν˜„λΆ€κ°€ μ—†λ‹€λŠ” 의미둜 abstract ν‚€μ›Œλ“œλ₯Ό λ©”μ„œλ“œ 선언뢀에 μΆ”κ°€ν•œλ‹€.

⇒abstract method design pattern

좔상(abstract)ν΄λž˜μŠ€λŠ” 상속 μ „μš©μ˜ 클래슀둜, μžμ‹ ν΄λž˜μŠ€λŠ” abstract methodλ₯Ό λ°˜λ“œμ‹œ μž¬μ •μ˜ν•  μ±…μž„μ„ 가진닀. ν΄λž˜μŠ€μ— κ΅¬ν˜„λΆ€κ°€ μ—†λŠ” λ©”μ„œλ“œκ°€ μžˆμœΌλ―€λ‘œ 객체λ₯Ό 생성할 수 μ—†λ‹€.

즉, abstract ν΄λž˜μŠ€λŠ” κ΅¬ν˜„μ˜ κ°•μ œλ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ ν–₯μƒμ‹œν‚€λŠ” 역할을 ν•œλ‹€.

 

μ‚¬μš©λͺ©μ 

  • λ‹€ν˜•μ„±μ— μ˜ν•΄μ„œ κ°€λ³κ²Œ μƒμ†ν•΄μ„œ μ‚¬μš©ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•œλ‹€.
  • μ„±λŠ₯μ €ν•˜λ₯Ό 쀄일 수 μžˆλ‹€.
  • μ„€κ³„μ‹œ 무쑰건 overrideν•΄μ•Όν•œλ‹€λ©΄ μ œμ–΄ν•  λͺ©μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

πŸ”Interface

μΈν„°νŽ˜μ΄μŠ€λŠ” 졜고 μˆ˜μ€€μ˜ 좔상화 λ‹¨κ³„λ‘œ, 일반 λ©”μ„œλ“œλŠ” λͺ¨λ‘ abstract ν˜•νƒœμ΄λ‹€.

  • JDK 8μ—μ„œ default method와 static method μΆ”κ°€λ˜μ—ˆλ‹€.

ν˜•νƒœ: ν΄λž˜μŠ€μ™€ μœ μ‚¬ν•˜κ²Œ interface ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œλ‹€.

멀버 ꡬ성

  • λͺ¨λ“  λ©€λ²„λ³€μˆ˜λŠ” public static final이며 μƒλž΅κ°€λŠ₯ν•˜λ‹€.
  • λͺ¨λ“  λ©”μ„œλ“œλŠ” public abstract이며 μƒλž΅κ°€λŠ₯ν•˜λ‹€.

 

μΈν„°νŽ˜μ΄μŠ€ 상속

  • ν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μΈν„°νŽ˜μ΄μŠ€λ„ extendsλ₯Ό μ΄μš©ν•΄ 상속이 κ°€λŠ₯ν•˜λ‹€.
  • ν΄λž˜μŠ€μ™€ λ‹€λ₯Έ 점은 μΈν„°νŽ˜μ΄μŠ€λŠ” 닀쀑 상속이 κ°€λŠ₯ν•˜λ‹€λŠ” 점이닀.
public interface Heroable extends Fightable, Transformable{}
  • ν΄λž˜μŠ€λŠ” ν—·κ°ˆλ¦΄ λ©”μ†Œλ“œ κ΅¬ν˜„μ΄ μžˆμ—ˆμ§€λ§Œ, μΈν„°νŽ˜μ΄μŠ€λŠ” λ©”μ„œλ“œ κ΅¬ν˜„ μžμ²΄κ°€ μ—†κΈ° λ•Œλ¬Έμ— ν—·κ°ˆλ¦΄ 일이 μ—†λ‹€.
  • implementsν•œ ν΄λž˜μŠ€λŠ” λͺ¨λ“  abstract λ©”μ„œλ“œλ₯Ό overrideν•΄μ„œ κ΅¬ν˜„ν•˜κ±°λ‚˜ κ΅¬ν˜„ν•˜μ§€ μ•Šμ„ 경우 abstract 클래슀λ₯Ό ν‘œμ‹œν•΄μ•Ό ν•œλ‹€.

 

μΈν„°νŽ˜μ΄μŠ€μ˜ ν•„μš”μ„±

  • κ΅¬ν˜„μ˜ κ°•μ œλ‘œ ν‘œμ€€ν™” 처리 → μ†μ‰¬μš΄ λͺ¨λ“ˆ ꡐ체 지원

 

default method

μΈν„°νŽ˜μ΄μŠ€μ— μ„ μ–Έλœ κ΅¬ν˜„λΆ€κ°€ μžˆλŠ” 일반 λ©”μ„œλ“œ

→default λ©”μ„œλ“œλŠ” abstractκ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— λ°˜λ“œμ‹œ κ΅¬ν˜„ν•΄μ•Όν•  ν•„μš”μ„±μ΄ 없어진닀.

  • default method의 좩돌
  • JDK 1.7κΉŒμ§€λŠ” κ΅¬ν˜„λΆ€κ°€ μ—†μ—ˆμœΌλ―€λ‘œ 좩돌이 μ—†μ—ˆμœΌλ‚˜, JDK 1.8λΆ€ν„°λŠ” default methodλŠ” λ¬΄μ‹œλœλ‹€.

 

 

 

πŸ“–Singleton νŒ¨ν„΄

ν•΄λ‹Ή ν΄λž˜μŠ€λ‘œλΆ€ν„° 단 ν•˜λ‚˜μ˜ 객체λ₯Ό 생성할 것을 보μž₯ν•˜λŠ” νŒ¨ν„΄

 

κ·œμΉ™

  1. μƒμ„±μžμ˜ access modifierλŠ” private으둜 μ„ μ–Έν•΄μ•Ό ν•œλ‹€.
  2. λ‚΄λΆ€μ—μ„œ μƒμ„±ν•΄μ„œ 객체λ₯Ό 전달할 static λ©”μ†Œλ“œ μ œκ³΅ν•΄μ•Ό ν•œλ‹€.
  3. λ‚΄λΆ€μ—μ„œ μƒμ„±λœ κ°μ²΄λŠ” static으둜 μ„ μ–Έν•œλ‹€.
class MySingleton{
	private static MySingleton instance = new MySingleton();
	private MySingleton() {}
	public static MySingleton getInstance() {
//		synchronized (MySingleton.class) {
//			if(instance == null) {
//				instance = new MySingleton();
//			}	
//		}
		return instance; 
	}
}

public class SingletonTest {
	public static void main(String[] args) {
		MySingleton instance1 = MySingleton.getInstance();
		MySingleton instance2 = MySingleton.getInstance();
		System.out.println(instance1==instance2); //true
	}
}

 

 

728x90

'기타 > Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

JVM  (0) 2024.10.30
JAVA(2)  (0) 2024.01.28
[λ””μžμΈνŒ¨ν„΄]Iterator Pattern  (0) 2021.12.02
[Design Pattern]Adapter Pattern  (0) 2021.11.16
[Design Pattern]Command Pattern  (0) 2021.11.16