Skip to content

Latest commit

Β 

History

History
executable file
Β·
552 lines (393 loc) Β· 26.2 KB

File metadata and controls

executable file
Β·
552 lines (393 loc) Β· 26.2 KB

OOP(Object-Oriented Programming)

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ μš°λ¦¬κ°€ μ‚΄κ³ μžˆλŠ” μ‹€μ œ μ„Έκ³„μ²˜λŸΌ λͺ¨λ“  것은 사물(객체)둜 이루어져 있고 λͺ¨λ“ μΌμ€ 각 객체의 μƒν˜Έμž‘μš©μ— μ˜ν•΄ λ°œμƒν•œλ‹€.λ₯Ό κΈ°λ³Έκ°œλ…μœΌλ‘œ λ°œμ „ν•΄μ™”μŠ΅λ‹ˆλ‹€.
μ—¬κΈ°μ„œ κ°μ²΄λŠ” 책상, 의자, 컴퓨터 λ“± 우리 λˆˆμ— λ³΄μ΄λŠ” 것 뿐만 μ•„λ‹ˆλΌ 논리, 사상, κ°œλ… λ“± λ¬΄ν˜•μ˜ λŒ€μƒλ“€λ„ 객체에 ν•΄λ‹Ήλ©λ‹ˆλ‹€.

  • OOPλŠ” Java와 C++, Python 등을 ν¬ν•¨ν•œ λ§Žμ€ ν”„λ‘œκ·Έλž˜λ° 언어에 κΈ°μ΄ˆν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„ 쀑 ν•˜λ‚˜
  • ν”„λ‘œκ·Έλž˜λ°μ—μ„œ ν•„μš”ν•œ 데이터λ₯Ό μΆ”μƒν™”μ‹œμΌœ μƒνƒœμ™€ ν–‰μœ„λ₯Ό κ°€μ§„ 객체λ₯Ό λ§Œλ“€κ³  κ·Έ 객체듀 κ°„μ˜ 유기적인 μƒν˜Έμž‘μš©μ„ 톡해 λ‘œμ§μ„ κ΅¬μ„±ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° 방법(기쑴의 ν”„λ‘œκ·Έλž˜λ° 언어와 λ‹€λ₯Έ μƒˆλ‘œμš΄ 것이 μ•„λ‹˜)
  • 객체의 κ΄€μ μ—μ„œ ν”„λ‘œκ·Έλž˜λ°μ„ 함
  • μ ˆμ°¨μ§€ν–₯κ³Ό λΉ„κ΅ν•΄μ„œ μ‚¬λžŒμ˜ 사고방식과 κ°€κΉŒμ›€

1. OOP의 νŠΉμ§• 및 μž₯점

OOP의 νŠΉμ§•μ΄μž μž₯점은 λŒ€ν‘œμ μœΌλ‘œ λ‹€μŒ 3κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

    1. μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±β†‘
    • 이미 생성해놓은 객체λ₯Ό 가져와 μ‚¬μš©κ°€λŠ₯
    • 상속을 톡해 ν•„μš”ν•œ μš”μ†Œλ₯Ό μΆ”κ°€ν•΄ ν™•μž₯ μ‚¬μš© κ°€λŠ₯
    1. μœ μ§€λ³΄μˆ˜ 용이
    • μ½”λ“œκ°„μ˜ 관계성을 μ΄μš©ν•˜μ—¬ μ½”λ“œ 관리 κ°€λŠ₯
    • μˆ˜μ •μ΄ ν•„μš”ν•œ μ½”λ“œλŠ” 보톡 클래슀 λ‚΄λΆ€μ˜ 멀버 λ³€μˆ˜ ν˜Ήμ€ λ©”μ„œμŠ€(method)에 쑴재
    1. 신뒰성↑
    • μ½”λ“œ μ€‘λ³΅λ¬Έμ œβŒ
    • μ œμ–΄μžμ™€ λ©”μ„œλ“œλ₯Ό μ΄μš©ν•΄μ„œ 데이터 보호 및 μ˜¬λ°”λ₯Έ κ°’ μœ μ§€

μœ„μ˜ μž₯점듀을 λ³Ό λ•Œ κ°€μž₯ 큰 μž₯점은 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ΄ λ†’κ³  μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•˜λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ μž₯점듀은 ν”„λ‘œκ·Έλž¨μ˜ 개발과 μœ μ§€λ³΄μˆ˜μ— μ†Œλͺ¨λ˜λŠ” μ‹œκ°„μ„ 획기적으둜 κ°œμ„ ν•΄ μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.

2. ν΄λž˜μŠ€μ™€ 객체

1.ν΄λž˜μŠ€μ™€ 객체의 μ •μ˜μ™€ μš©λ„

ꡬ뢄 μ •μ˜ μš©λ„
클래슀(Class) 객체λ₯Ό μ •μ˜ 객체 생성
객체(Object) ν˜„μ‹€ 세계에 μ‘΄μž¬ν•˜λŠ” 사물 λ˜λŠ” κ°œλ… 각 객체가 κ°€μ§€κ³  μžˆλŠ” κΈ°λŠ₯κ³Ό 속성

객체(Object)λŠ” μ•žμ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ μš°λ¦¬κ°€ '인지할 수 있고 μ‹€μž¬ν•˜λŠ” λͺ¨λ“  것'이자 'μ‚¬μš©ν•  수 μžˆλŠ” 싀체'λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 그리고 클래슀(Class)λž€ 이런 객체λ₯Ό μ •μ˜ν•΄ 놓은 섀계도 λ˜λŠ” 틀이라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ μ‹€μƒν™œμ—μ„œ ν΄λž˜μŠ€μ™€ 객체의 관계λ₯Ό λ‚˜νƒ€λ‚΄λ©΄

  • μžλ™μ°¨ 섀계도와 μ™„μ„±λœ μžλ™μ°¨
  • λ ˆμ‹œν”Όμ™€ λ§Œλ“€μ–΄μ§„ μŒμ‹
  • νœ΄λŒ€ν° 섀계도와 μš°λ¦¬κ°€ μ‚¬μš©ν•˜κ³  μžˆλŠ” νœ΄λŒ€ν°
  • λΆ•μ–΄λΉ΅ 기계와 λΆ•μ–΄λΉ΅

으둜 μ˜ˆμ‹œλ₯Ό λ“€ 수 μžˆκ² μŠ΅λ‹ˆλ‹€.
μœ„μ˜ μ˜ˆμ‹œμ—μ„œ '섀계도'에 ν•΄λ‹Ήν•˜λŠ” 'μžλ™μ°¨ 섀계도', 'λ ˆμ‹œν”Ό', 'νœ΄λŒ€ν° 섀계도', 'λΆ•μ–΄λΉ΅ 기계'κ°€ ν΄λž˜μŠ€μ— ν•΄λ‹Ήλ©λ‹ˆλ‹€.
그리고 클래슀λ₯Ό 톡해 μƒμ„±λœ 'μžλ™μ°¨', 'μŒμ‹', 'νœ΄λŒ€ν°', 'λΆ•μ–΄λΉ΅'을 객체라고 ν•˜λŠ”λ° ν΄λž˜μŠ€μ— μ˜ν•΄ μƒμ„±λœ 객체λ₯Ό ν•΄λ‹Ή 클래슀의 μΈμŠ€ν„΄μŠ€(instance)라고 ν•©λ‹ˆλ‹€. 그리고 ν΄λž˜μŠ€λ‘œλΆ€ν„° 객체λ₯Ό λ§Œλ“œλŠ” 과정을 μΈμŠ€ν„΄μŠ€ν™”(instantiate)라고 ν•©λ‹ˆλ‹€.

객체와 μΈμŠ€ν„΄μŠ€λŠ” 같은 μ˜λ―Έμ΄λ―€λ‘œ μ‚¬μš©μ— 차이λ₯Ό λ‘˜ ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€. λ‹€λ§Œ κ°μ²΄λŠ” λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ₯Ό μ˜λ―Έν•œλ‹€λ©΄, μΈμŠ€ν„΄μŠ€λŠ” ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€κ°€ μ–΄λ–€ ν΄λž˜μŠ€λ‘œλΆ€ν„° μƒμ„±λ˜μ—ˆλŠ”μ§€λ₯Ό κ°•μ‘°ν•œλ‹€λŠ” 데 의미의 차이가 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’‘ μΈμŠ€ν„΄μŠ€(Instance)

  • ν΄λž˜μŠ€λŠ” 객체의 속성을 μ •μ˜ν•˜κ³ , κΈ°λŠ₯을 κ΅¬ν˜„ν•˜μ—¬ λ§Œλ“€μ–΄ 놓은 μ½”λ“œ μƒνƒœ
  • μ‹€μ œ 클래슀 기반으둜 μƒμ„±λœ 객체(μΈμŠ€ν„΄μŠ€)λŠ” 각각 λ‹€λ₯Έ 멀버 λ³€μˆ˜ 값을 가짐
  • new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€ 생성

2. 객체(Object)

1. 객체의 κ΅¬μ„±μš”μ†Œ - 속성과 κΈ°λŠ₯

κ°μ²΄λŠ” 속성과 κΈ°λŠ₯μ΄λΌλŠ” 두 κ°€μ§€ κ΅¬μ„±μš”μ†Œλ‘œ 이뀄져 μžˆμŠ΅λ‹ˆλ‹€. 일반적으둜 κ°μ²΄λŠ” μ—¬λŸ¬κ°€μ§€ 속성과 κΈ°λŠ₯을 κ°€μ§€κ³  있으며 κ°μ²΄λŠ” 이 속성과 κΈ°λŠ₯λ“€μ˜ 집합이라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, 객체가 κ°€μ§€κ³  μžˆλŠ” 속성과 κΈ°λŠ₯을 κ·Έ 객체의 멀버(member)라고 ν•©λ‹ˆλ‹€.

속성(property)은 λ©€λ²„λ³€μˆ˜, ν•„λ“œ(field), νŠΉμ„±, μƒνƒœλΌκ³ λ„ ν•˜κ³  κΈ°λŠ₯(function)은 λ©”μ„œλ“œ(method), ν•¨μˆ˜, ν–‰μœ„λΌκ³  μ§€μΉ­ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€. 보톡은 속성과 ν•„λ“œ, 그리고 κΈ°λŠ₯은 보톡 λ©”μ„œλ“œλΌκ³  μ§€μΉ­ν•©λ‹ˆλ‹€.

속성과 κΈ°λŠ₯을 'λΌλ””μ˜€'둜 예λ₯Ό λ“€μ–΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.
λΌλ””μ˜€μ˜ μ†μ„±μœΌλ‘œλŠ” μ „μ›μƒνƒœ, λ„ˆλΉ„, 높이, 색상, λ³Όλ₯¨, 채널과 같은 것듀이 μžˆμ„ 수 있고, κΈ°λŠ₯μœΌλ‘œλŠ” 전원 turnOn/Off, λ³Όλ₯¨ ↑/↓, 채널변경 등이 μžˆκ² μŠ΅λ‹ˆλ‹€. 이λ₯Ό 클래슀 객체의 μ½”λ“œλ‘œ μž‘μ„±ν•΄λ³΄λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

class Radio {
	// λΌλ””μ˜€μ˜ 속성(attribute)
	boolean power;
    String color;
    int volume;
    double channel;


    // λΌλ””μ˜€μ˜ κΈ°λŠ₯(method)
    void stateOfPower {
    	if(power == true) System.out.prinLn("ν˜„μž¬ 전원이 μΌœμ§„ μƒνƒœμž…λ‹ˆλ‹€");
        else System.out.println("ν˜„μž¬ 전원이 κΊΌμ§„ μƒνƒœμž…λ‹ˆλ‹€");
    }
    void turnOn() {
    	power = true;
    	System.out.println("전원을 μΌ­λ‹ˆλ‹€");
    }
    void turnOff() {
    	power = false;
    	System.out.println("전원을 λ•λ‹ˆλ‹€");
    }

    void volumeUp() {
    	volume++;
    	System.out.println("ν˜„μž¬ λ³Όλ₯¨μ€ " +volume + "μž…λ‹ˆλ‹€");
    }
    void volumeDown() {
    	volume--;
    	System.out.println("ν˜„μž¬ λ³Όλ₯¨μ€ " + volume + "μž…λ‹ˆλ‹€");
    }

    void channelUp() {
		channel++;
    	System.out.println("ν˜„μž¬μ±„λ„μ€ (ch)" + channel + "μž…λ‹ˆλ‹€");
    }
    void channelDown() {
    	channel--;
    	System.out.println("ν˜„μž¬ 채널은 (ch)" + channel + "μž…λ‹ˆλ‹€");
    }
}

2. 객체의 생성과 μ‚¬μš©

1. 객체의 생성과 μ‚¬μš©

μœ„μ˜ μ˜ˆμ‹œλŠ” λ‹¨μˆœνžˆ λΌλ””μ˜€μ˜ 섀계도에 λΆˆκ³Όν•˜κΈ° λ•Œλ¬Έμ— λΌλ””μ˜€λ‘œ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 섀계λ₯Ό 끝낸 객체λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ 객체λ₯Ό μƒμ„±ν•΄μ•Όν•©λ‹ˆλ‹€. 즉, μΈμŠ€ν„΄μŠ€ν™” ν•΄μ•Όν•©λ‹ˆλ‹€.
객체λ₯Ό 생성할 λ•ŒλŠ” newμ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€ν™” ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 μƒμ„±λœ 객체에 포인트 μ—°μ‚°μž.λ₯Ό μ‚¬μš©ν•΄μ„œ 객체의 멀버에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class RadioTest {
	public static void main(String args[]) {
    	Radio myRadio = new Radio();
        myRadio.power = true;
        myRadio.color = blue;
        myRadio.volume = 5;
        myRadio.channel = 7.0;

        myRadio.turnOn()
        myRadio.volumeUp();
        myRadio.channelDown();
    }
}

2. 객체의 생성과정

λ‹€μŒμœΌλ‘œ 객체가 μ–΄λ–»κ²Œ μ €μž₯되고 값이 ν• λ‹Ήλ˜λŠ”μ§€ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

1. μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜κΈ°μœ„ν•œ μ°Έμ‘°λ³€μˆ˜ 생성

Radio myRadio;

Radioνƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜ myRadioλ₯Ό μ„ μ–Έν•˜κ³  λ©”λͺ¨λ¦¬μ— μ°Έμ‘°λ³€μˆ˜ myRadioλ₯Ό μœ„ν•œ 곡간이 λ§ˆλ ¨λ©λ‹ˆλ‹€.

2. μΈμŠ€ν„΄μŠ€ 생성 ν›„, 객체의 μ£Όμ†Œλ₯Ό μ°Έμ‘°λ³€μˆ˜μ— ν• λ‹Ή

myRadio = new Radio();

newμ—°μ‚°μžμ— μ˜ν•΄ Radio클래슀의 μΈμŠ€ν„΄μŠ€κ°€ λ©”λͺ¨λ¦¬μ˜ 빈 곡간에 μƒμ„±λ©λ‹ˆλ‹€. μ΄λ•Œ newμ—°μ‚°μžλ‘œ μƒμ„±λœ κ°μ²΄λŠ” Heap Memory에 μƒμ„±λ˜κ³ , μ°Έμ‘°λ³€μˆ˜ myRadioλŠ” μΈμŠ€ν„΄μŠ€κ°€ μ €μž₯λ˜μ–΄ μžˆλŠ” νž™ λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œκ°’μ„ κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
μ—¬κΈ°μ„œ 객체생성 μ‹œμ˜ λ©”λͺ¨λ¦¬ ꡬ쑰λ₯Ό 자깐 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

πŸ’‘ 객체생성 μ‹œ λ©”λͺ¨λ¦¬ ꡬ쑰 >
μœ„μ˜ 그림을 λ³΄μ‹œλ©΄ 'new'μ—°μ‚°μžλ‘œ μƒμ„±λœ 객체가 νž™ λ©”λͺ¨λ¦¬ μ˜μ—­μ— μ €μž₯λ˜λŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 클래슀 μ˜μ—­, μŠ€νƒ μ˜μ—­, νž™ λ©”λͺ¨λ¦¬ μ˜μ—­μœΌλ‘œ κ΅¬μ„±λœ 곳이 λ°”λ‘œ JVM의 Runtime Data Areaμž…λ‹ˆλ‹€.
μ°Έμ‘°λ³€μˆ˜λ₯Ό μƒμ„±ν•˜λ©΄ μ°Έμ‘°λ³€μˆ˜κ°€ μ°Έμ‘°ν•  ν΄λž˜μŠ€νƒ€μž…μ€ '클래슀 μ˜μ—­' 에 그리고 μ°Έμ‘°λ³€μˆ˜λŠ” 일반 λ³€μˆ˜μ™€ 같이 'μŠ€νƒ(stack)' μ˜μ—­μ— μ €μž₯λ©λ‹ˆλ‹€.
그리고 newμ—°μ‚°μžλ‘œ 객체λ₯Ό νž™ λ©”λͺ¨λ¦¬ μ˜μ—­μ— μ €μž₯ν•˜λ©΄ μ°Έμ‘°λ³€μˆ˜ myRadioλŠ” νž™λ©”λͺ¨λ¦¬ μ˜μ—­μ— 적재된 μ£Όμ†Œκ°’μ„ μ°Έμ‘°ν•˜κ²Œ λ©λ‹ˆλ‹€.
μ—¬κΈ°μ„œ μ€‘μš”ν•œ 것은 속성은 νž™ λ©”λͺ¨λ¦¬ μ˜μ—­μ— μ €μž₯λ˜λŠ” 것에 λ°˜ν•΄ λ©”μ„œλ“œλŠ” '클래슀 μ˜μ—­' 에 μ €μž₯λ©λ‹ˆλ‹€. λ©”μ„œλ“œκ°€ ν΄λž˜μŠ€μ— μ €μž₯되고 κ°μ²΄μ•ˆμ—μ„œ λ©”μ„œλ“œμ˜ μœ„μΉ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” μ΄μœ λŠ” 같은 클래슀둜 λ§Œλ“  λͺ¨λ“  κ°μ²΄λŠ” λ™μΌν•œ λ©”μ„œλ“œλ₯Ό κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— ν•œλ²ˆλ§Œ μ €μž₯해두고 μ°Έμ‘°ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

3. ν•΄λ‹Ή 객체의 속성과 λ©”μ„œλ“œμ— μ ‘κ·Όν•˜μ—¬ μ‚¬μš©

myRadio.color = "red";
myRadio.turnOn();

μœ„μ˜ μ˜ˆμ œμ™€ 같이 .을 ν†΅ν•΄μ„œ 객체 μ•ˆμ— μžˆλŠ” ν•„λ“œκ°’κ³Ό λ©”μ„œλ“œμ— 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

πŸ’‘ νž™(Heap) λ©”λͺ¨λ¦¬

  • μƒμ„±λœ μΈμŠ€ν„΄μŠ€λŠ” 동적 λ©”λͺ¨λ¦¬μΈ νž™ λ©”λͺ¨λ¦¬(heap memory)에 할당됨
  • Cλ‚˜ C++ μ‚¬μš©ν•œ 동적 λ©”λͺ¨λ¦¬λ₯Ό 직접 ν•΄μ œ μ‹œμΌœμ•Όν•˜μ§€λ§Œ(free() or delete μ‚¬μš©), Javaμ—μ„œλŠ” Garbage Collectorκ°€ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό 수거
  • ν•˜λ‚˜μ˜ ν΄λž˜μŠ€λ‘œλΆ€ν„° μ—¬λŸ¬κ°œμ˜ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜κ³  각각 λ‹€λ₯Έ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 가짐

3. λ³€μˆ˜μ™€ λ©”μ„œλ“œ

1. μ„ μ–Έμœ„μΉ˜μ— λ”°λ₯Έ λ³€μˆ˜μ˜ μ’…λ₯˜

μžλ°”μ—μ„œ λ³€μˆ˜λŠ” 크게 클래슀 λ³€μˆ˜(cv, class variable), μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(iv, instance variable), μ§€μ—­ λ³€μˆ˜(lv, local variable) μ„Έ μ’…λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 μ„Έκ°€μ§€ λ³€μˆ˜λŠ” λ³€μˆ˜κ°€ μ„ μ–Έλœ μœ„μΉ˜μ— 따라 μ’…λ₯˜κ°€ κ²°μ •λ˜λ―€λ‘œ λ³€μˆ˜κ°€ μ–΄λ–€ ν•„λ“œμ— μ„ μ–Έλ˜μ—ˆλŠ”μ§€κ°€ κ°€μž₯ μ€‘μš”ν•©λ‹ˆλ‹€. 이듀은 μ„ μ–Έλœ μœ„μΉ˜μ— 따라 μ’…λ₯˜κ°€ κ²°μ •λ˜κ³  각각 λ‹€λ₯Έ 유효 λ²”μœ„(scope)λ₯Ό κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.

πŸ’‘ ν•„λ“œ(Field)

  • ν΄λž˜μŠ€μ— ν¬ν•¨λœ λ³€μˆ˜λ‘œ 클래슀 내에 μ •μ˜λœ 객체의 속성뢀뢄을 ν•„λ“œλΌκ³  μ§€μΉ­ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ ν•„λ“œμ— ν•΄λ‹Ήν•˜λŠ” λ³€μˆ˜λŠ” 클래슀 λ³€μˆ˜(cv)와 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(iv)μž…λ‹ˆλ‹€. 두 개의 λ³€μˆ˜λŠ” λ©€λ²„λ³€μˆ˜λΌκ³ λ„ ν•˜λ©° λ‚˜λ¨Έμ§€λŠ” μ§€μ—­λ³€μˆ˜(lv)에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.
λ©€λ²„λ³€μˆ˜ 쀑 static이 뢙은 것이 클래슀 λ³€μˆ˜μ΄κ³ , κ·Έλ ‡μ§€ μ•Šμ€ 것이 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μž…λ‹ˆλ‹€.

class Varialbe {
	int iv;			// μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
    static int cv;	// 클래슀 λ³€μˆ˜(staticλ³€μˆ˜, 곡유 λ³€μˆ˜);

    void method() {
    	int lv;		// μ§€μ—­λ³€μˆ˜, method(){}μ•ˆμ—μ„œλ§Œ 유효
    }
}

1. μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(iv)

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” λ©€λ²„λ³€μˆ˜μ— ν•΄λ‹Ήλ˜λ©° new μƒμ„±μž()λ₯Ό ν†΅ν•΄μ„œ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œ λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ°˜λ“œμ‹œ 이전에 μΈμŠ€ν„΄μŠ€λ₯Ό 생성해야 ν•©λ‹ˆλ‹€.
μΈμŠ€ν„΄μŠ€λŠ” νž™ λ©”λͺ¨λ¦¬μ˜ 독립적인 곡간에 μ €μž₯되고, μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ κ³ μœ ν•œ 값을 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
μ‚¬λžŒμ˜ 이름, μ „ν™”λ²ˆν˜Έ, λ‚˜μ΄, μ·¨λ―Έ 등이 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ‘œ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

2. 클래슀 λ³€μˆ˜

클래슀 λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜κ°€ 독립적인 μ €μž₯곡간을 κ°€μ§€λŠ”λ° λ°˜ν•΄ κ³΅ν†΅λœ μ €μž₯곡간을 κ³΅μœ ν•©λ‹ˆλ‹€. 클래슀둜 μƒμ„±λœ λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ 곡톡적인 값을 μœ μ§€ν•΄μ•Όν•˜λŠ” 경우 static을 μ‚¬μš©ν•˜μ—¬ 클래슀 λ³€μˆ˜λ‘œ μ„ μ–Έν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ˜ν•œ, 클래슀 λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό λ”°λ‘œ μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ μ–Έμ œλΌλ„ 클래슀λͺ….ν΄λž˜μŠ€λ³€μˆ˜λ₯Ό ν†΅ν•΄μ„œ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€. μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  μ‚¬μš©κ°€λŠ₯ν•œ μ΄μœ λŠ” 클래슀 λ³€μˆ˜λŠ” 클래슀 μ˜μ—­μ— μ €μž₯λ˜μ–΄ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

3. μ§€μ—­λ³€μˆ˜

μ§€μ—­λ³€μˆ˜λŠ” 클래슀 λ‚΄ λ©”μ„œλ“œ λ‚΄μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ν•œ λ³€μˆ˜μž…λ‹ˆλ‹€. μœ„μ˜ λ©€λ²„λ³€μˆ˜λ“€κ³Ό λ‹€λ₯΄κ²Œ μ§€μ—­λ³€μˆ˜λŠ” μŠ€νƒ λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜μ–΄ λ©”μ„œλ“œμ˜ μ’…λ£Œμ™€ ν•¨κ»˜ λ™μ‹œμ— μ†Œλ©Έλ˜μ–΄ 더이상 μ‚¬μš©ν•  수 μ—†κ²Œ λ©λ‹ˆλ‹€.

2. μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ 클래슀 λ³€μˆ˜μ˜ 비ꡐ

ꡬ뢄 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 클래슀 λ³€μˆ˜
생성 μ‹œμ  μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ
μ‚¬μš©κ°€λŠ₯ μ‹œμ  μΈμŠ€ν„΄μŠ€ 생성 ν›„ μΈμŠ€ν„΄μŠ€ 생성 μ „
생성 곡간 νž™ λ©”λͺ¨λ¦¬μ˜ μΈμŠ€ν„΄μŠ€ λ‚΄ 클래슀 μ˜μ—­μ˜ 클래슀 μ½”λ“œ λ‚΄
μš©λ„ 각 객체의 κ³ μœ ν•œ 속성 λͺ¨λ“  객체의 곡유 속성

3. 클래슀 λ³€μˆ˜μ˜ μ‚¬μš©

μ•žμ„œ μ–ΈκΈ‰ν•œ 것 처럼 클래슀 λ³€μˆ˜λŠ” λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅ν†΅λœ μ €μž₯곡간을 κ³΅μœ ν•˜κ³  클래슀 μ˜μ—­μ— μ €μž₯λ˜μ–΄ μΈμŠ€ν„΄μŠ€ν™”λ₯Ό ν•˜μ§€ μ•Šκ³  클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ°„λ‹¨ν•œ 예제λ₯Ό 톡해 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

public static void main(String[] args) {
	StaticEx staticEx1 = new StaticEx();
 	StaticEx staticEx2 = new StaticEx();

    staticEx1.num1 = 100;
    staticEx2.num1 = 200;

    staticEx1.num2 = 300;
    staticEx2.num2 = 400;

    System.out.println("staticEx1.num1 = " + staticEx1.num1);	// 100;
	System.out.println("staticEx2.num1 = " + staticEx2.num1);	// 200;
	System.out.println("staticEx1.num2 = " + staticEx1.num2);	// 400;
	System.out.println("staticEx2.num2 = " + staticEx2.num2);	// 400;
}

class StaticEx {
	int num1;
    static int num2;
}

staticλ³€μˆ˜λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” μ°Έμ‘°λ³€μˆ˜λͺ…이 μ•„λ‹ˆλΌ 클래슀λͺ….λ³€μˆ˜λͺ…μœΌλ‘œ μ°Έμ‘°ν•΄μ•Όν•˜μ§€λ§Œ μΈμŠ€ν„΄μŠ€ λ²Όλˆ—μ™€ 직접적인 차이점을 ν™•μΈν•˜κΈ° μœ„ν•΄ μ°Έμ‘°λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

각 μ†μ„±μ˜ 값을 100, 200, 300, 400을 μž…λ ₯ν–ˆμŠ΅λ‹ˆλ‹€. 좜λ ₯ μ‹œμ—λ„ 100, 200, 300, 400이 좜λ ₯λ˜μ–΄μ•Όν•  것 κ°™μ§€λ§Œ μΈμŠ€ν„΄μŠ€λ³€μˆ˜λŠ” 각 고유의 값을 좜λ ₯ν•œ 것에 λ°˜ν•΄, staticλ³€μˆ˜λ‘œ μ„ μ–Έλœ num2λŠ” λͺ¨λ‘ 400으둜 좜λ ₯됨을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

이처럼 staticλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ— κ³΅ν†΅μ μœΌλ‘œ κ³΅μœ λ˜λŠ” 값이 μ μš©λœλ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 ν΄λž˜μŠ€λ³€μˆ˜λŠ” λ‹€μŒκ³Ό 같은 μ‚¬μš©μ„ ꢌμž₯ν•©λ‹ˆλ‹€.

StaticEx.num2 = 400;

4. λ©”μ„œλ“œ(Method)

λ©”μ„œλ“œ(method)λŠ” **"νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 일련의 λͺ…λ Ήλ¬Έλ“€μ˜ μ§‘ν•©"**을 μ˜λ―Έν•©λ‹ˆλ‹€. μ•žμ„œ 예제둜 λ΄€μ—ˆλ˜ λΌλ””μ˜€ μ˜ˆμ œμ—μ„œ μ „μ›μΌœκΈ°, λ³Όλ₯¨μ‘°μ ˆ, μ±„λ„μ‘°μ ˆ 등이 λ©”μ„œλ“œ μž…λ‹ˆλ‹€.

1. λ©”μ„œλ“œμ˜ ꡬ쑰

λ©”μ„œλ“œλŠ” λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜μ™€ '{}'μ•ˆμ˜ λ©”μ„œλ“œ λ°”λ””λ‘œ ꡬ뢄할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ œμ–΄μž λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œλͺ…(맀개 λ³€μˆ˜) {	// λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜
	λ©”μ„œλ“œ λ‚΄μš©	// λ©”μ„œλ“œ λ°”λ””
}

public static int add(int x, int y) {
	return x + y;
}

λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜μ—λŠ” μ œμ–΄μž λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œλͺ… 그리고 λ§€κ°œλ³€μˆ˜κ°€ ν•„μš”ν•œλ°, μ—¬κΈ°μ„œ λ§€κ°œλ³€μˆ˜λŠ” λ©”μ„œλ“œ λ°”λ””μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 속성을 μž…λ ₯λ°›λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.

2. λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Όν•˜λŠ” 이유

λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ 얻을 수 μžˆλŠ” 이점은 λ‹€μŒκ³Ό 같은 3κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

  • 높은 μž¬μ‚¬μš©μ„±(reusability)
  • μ€‘λ³΅μ½”λ“œμ œκ±°
  • ν”„λ‘œκ·Έλž¨μ˜ ꡬ쑰화

μ•„λ¬΄λž˜λ„ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ ν•œλ²ˆ λ§Œλ“€μ–΄ 놓은 λ©”μ„œλ“œλ₯Ό ν•„μš”ν•œ 만큼 λ°˜λ³΅ν•΄μ„œ μ‚¬μš©ν•  수 있고, λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—μ„œλ„ λ©”μ„œλ“œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— μž¬μ‚¬μš©μ„±μ„ 높일 수 있고 μ€‘λ³΅μ½”λ“œλ₯Ό 제거 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ mainλ©”μ„œλ“œμ— ν•œλ²ˆμ— μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ μž‘μ—… λ‹¨μœ„λ‘œ λ‚˜λˆ μ„œ ν”„λ‘œκ·Έλž˜λ°ν•  수 μžˆμ–΄μ„œ ν”„λ‘œκ·Έλž¨μ˜ ꡬ쑰화가 κ°€λŠ₯ν•©λ‹ˆλ‹€.

3. λ©”μ„œλ“œμ˜ 호좜

λ©”μ„œλ“œλ₯Ό μ •μ˜ν•œλ‹€κ³  ν•΄μ„œ μ‚¬μš©λ˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. λ©”μ„œλ“œλ₯Ό ν•„μš”ν•œ 곳에 ν˜ΈμΆœν•΄μ•Ό λ©”μ„œλ“œ λ°”λ””μ˜ μˆ˜ν–‰λ¬Έλ“€μ΄ μˆ˜ν–‰λ©λ‹ˆλ‹€. μ™ΈλΆ€ 클래슀의 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μΈμŠ€ν„΄μŠ€ 생성 ν›„ μ‚¬μš©ν•΄μ•Ό ν•˜μ§€λ§Œ 동일 클래슀의 λ©”μ„œλ“œλΌλ¦¬λŠ” λ”°λ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  ν˜ΈμΆœκ°€λŠ₯ν•©λ‹ˆλ‹€.

λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

void add(int x, int y) {
	System.out.printf("x + y = %d", x + y);
}

void printHelloWorld() {
	System.out.println("Hello World!");
}

printHelloWorld();
add(3, 5);

add()λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ κ΄„ν˜Έ()μ•ˆμ— 값을 μ μ–΄μ£Όκ²Œλ˜λŠ”λ° 이것을 인자(argument)라고 ν•©λ‹ˆλ‹€. 인자의 κ°œμˆ˜μ™€ μˆœμ„œλŠ” μ •μ˜λœ λ§€μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜μ™€ μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. ν˜Ήμ€ μžλ™ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.

4. λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©(Method Overloading)

λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ€ ν•˜λ‚˜μ˜ 클래슀 μ•ˆμ— 같은 μ΄λ¦„μœΌλ‘œ 된 λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬κ°œ μ •μ˜ ν•œ 것을 λ§ν•©λ‹ˆλ‹€. λ©”μ„œλ“œλŠ” λ©”μ„œλ“œμ˜ 이름 λ˜λŠ” λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ΄ λ‹€λ₯΄λ©΄ λ‹€λ₯Έ λ§€κ°œλ³€μˆ˜λΌκ³  μΈμ‹ν•˜λŠ” μžλ°” κ°€μƒλ¨Έμ‹ μ˜ κΈ°λŠ₯κ³Ό 관계가 μžˆμŠ΅λ‹ˆλ‹€.

μ˜€λ²„λ‘œλ”©(overloading)의 사전적 μ˜λ―ΈλŠ” 'κ³Όμ ν•˜λ‹€'μž…λ‹ˆλ‹€. 즉 많이 μ‹£λŠ” 것을 λœ»ν•˜λŠ”λ° ν•˜λ‚˜μ˜ λ©”μ„œλ“œμ— μ—¬λŸ¬ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° λ•Œλ¬Έμ— λΆ™μ—¬μ§„ μ΄λ¦„μž…λ‹ˆλ‹€.

public class Overloading {
	public static void main(String[] args) {
		Add result = new Add();

       result.addNum();
       result.addNum(2, 3);
       result.addNum(2, 3, 5);
       result.addNum(2, 3, 5, 10);
    }
}

class Add {
	public void addNum() {
    	System.out.println("계산할 숫자λ₯Ό μž…λ ₯ν•΄ μ£Όμ„Έμš”");
    }

	public void addNum(int x, int y) {
    	System.out.printf("%d + %d = %d\n", x, y, x+y);
    }

    public void addNum(int x, int y, int z) {
    	System.out.printf("%d + %d + %d = %d\n", x, y, z, x+y+z);
    }

    public void addNum(int x, int y, int z, int a) {
    	System.out.printf("%d + %d + %d + %d = %d\n", x, y, z, a, x+y+z+a);
    }
}

/* ====== result ======
계산할 숫자λ₯Ό μž…λ ₯ν•΄ μ£Όμ„Έμš”
2 + 3 = 5
2 + 3 + 5 = 10
2 + 3 + 5 + 10 = 20
====================== */

μœ„μ˜ μ˜ˆμ‹œμ™€ 같이 addNum()μ΄λΌλŠ” 이름을 κ°€μ§„ λ™μΌν•œ μ΄λ¦„μ˜ λ©”μ„œλ“œκ°€ 4κ°œκ°€ μ‘΄μž¬ν•˜λŠ”λ° λ©”μ„œλ“œλ§ˆλ‹€ λ‹€λ₯Έ 값을 좜λ ₯ν•˜λŠ” 것을 보싀 수 μžˆμŠ΅λ‹ˆλ‹€. 무쑰건 λ§€μ„œλ“œλͺ…λ§Œ κ°™λ‹€κ³  λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ΄ λ˜λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€.
λ©”μ„œλ“œλ₯Ό μ˜€λ²„λ‘œλ”©ν•˜κΈ° μœ„ν•œ μ‘°κ±΄μœΌλ‘œλŠ” λ‹€μŒ 두 κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

  • λ©”μ„œλ“œμ˜ 이름이 일치
  • λ§€κ°œλ³€μˆ˜μ˜ 개수 λ˜λŠ” νƒ€μž…μ΄ 달라야함

λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ˜ μž₯μ μœΌλ‘œλŠ” ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ‘œ μ—¬λŸ¬ 경우의 수λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€λŠ” μ μž…λ‹ˆλ‹€. λ§Œμ•½ λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ΄ μ—†μ—ˆλ‹€λ©΄ μœ„μ˜ 예제의 경우 '2개의 수λ₯Ό λ”ν•˜λŠ” λ§€μ„œλ“œλͺ…', '3개의 수λ₯Ό λ”ν•˜λŠ” λ§€μ„œλ“œλͺ…', '4개의 수λ₯Ό λ”ν•˜λŠ” λ§€μ„œλ“œλͺ…' λ“± 경우의 μˆ˜μ— λ”°λ₯Έ λ§€μ„œλ“œλͺ…을 μΆ”κ°€ν•˜κ³  μ‚¬μš©ν•  λ•Œλ§ˆλ‹€ λ§€μ„œλ“œλͺ…을 검색해야 ν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ λ°œμƒν•  κ²ƒμž…λ‹ˆλ‹€.

4. μƒμ„±μž

μƒμ„±μžλŠ” μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œ ν˜ΈμΆœλ˜λŠ” μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λ©”μ„œλ“œ μž…λ‹ˆλ‹€. μƒμ„±μž μ—­μ‹œ λ©”μ„œλ“œ 처럼 클래슀 내에 μ„ μ–Έλ˜κ³  λ©”μ„œλ“œμ™€ λΉ„μŠ·ν•˜μ§€λ§Œ return값이 μ—†λŠ” 것이 νŠΉμ§•μž…λ‹ˆλ‹€. μƒμ„±μžμ˜ 쑰건은 λ‹€μŒ 두 κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

  • μƒμ„±μžμ˜ 이름은 클래슀의 이름과 κ°™μ•„μ•Ό 함
  • μƒμ„±μžλŠ” 리턴 값이 μ—†μŒ

μƒμ„±μžλŠ” κΈ°λ³Έ μƒμ„±μžμ™€ λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžλ‘œ λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€. κΈ°λ³Έ μƒμ„±μžμ™€ λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžλ₯Ό κ°„λ‹¨ν•˜κ²Œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

클래슀 이름(νƒ€μž…λ³€μˆ˜λͺ…, νƒ€μž…λ³€μˆ˜λͺ…, ...) {
	// μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ΄ˆκΈ°ν™”
}

Card() {	// κΈ°λ³Έ μƒμ„±μž
}

Card(String customerID, String cardNum, String customerName) {	// λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μž
	...
}

μœ„μ˜ μ˜ˆμ‹œμ—μ„œ λ³Ό 수 μžˆλ“―μ΄ κΈ°λ³Έ μƒμ„±μžμ™€ λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžλ‘œ μƒμ„±μž μ˜€λ²„λ‘œλ”©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€. ν΄λž˜μŠ€μ—μ„œ 봀듯이 μƒμ„±μžλŠ” 객체λ₯Ό μƒμ„±ν•˜λŠ” 것이기 λ•Œλ¬Έμ— newλ₯Ό μ‚¬μš©ν•΄μ„œ ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1. κΈ°λ³Έ μƒμ„±μž(default constructor)

κΈ°λ³Έ μƒμ„±μžλŠ” μœ„μ˜ μ˜ˆμ œμ—μ„œ λ³Ό 수 μžˆλ“―μ΄ λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μž μž…λ‹ˆλ‹€. λͺ¨λ“  ν΄λž˜μŠ€μ—λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜ μ΄μƒμ˜ μƒμ„±μžκ°€ μ •μ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μƒμ„±μžλ₯Ό μ„ μ–Έν•˜μ§€ μ•Šμ•„λ„ 클래슀λ₯Ό μΈμŠ€ν„΄μŠ€ν™” ν•  수 μžˆμ—ˆλŠ”λ° μ΄λŠ” μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ 'κΈ°λ³Έ μƒμ„±μž(default constructor)'λ₯Ό μ œκ³΅ν•΄μ£ΌκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

class Card {
	int cardNum;

    Card(int cardNum) {
    this.cardNum = cardNum;
    }
}
class defaultEx {
	public static void main(String[] args) {
    	Card SHcard = new Card();	// compile error λ°œμƒ
    }
}

μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±μžλ₯Ό μ„ μ–Έν–ˆμ§€λ§Œ μ—λŸ¬κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. κ·Έ μ΄μœ λŠ” 클래슀 λ‚΄λΆ€μ—μ„œ μƒμ„±μžλ₯Ό λ§Œλ“€μ—ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. κΈ°λ³Έ μƒμ„±μžλŠ” 클래슀 λ‚΄ μƒμ„±μžκ°€ 단 1κ°œλΌλ„ 있으면 μƒμ„±λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

2. λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μž

λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžλŠ” λ©”μ„œλ“œμ²˜λŸΌ 호좜 μ‹œ 인자 값을 λ„˜κ²¨λ°›μ•„μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” μƒμ„±μž μž…λ‹ˆλ‹€. λ§€κ°œλ³€μˆ˜λ‘œλŠ” 클래슀의 속성듀이 μ†ν•©λ‹ˆλ‹€. μœ„μ˜ μ˜ˆμ œμ—μ„œ CardλŠ” λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžλ₯Ό κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€.

3. μƒμ„±μž μ˜€λ²„λ‘œλ”©

μƒμ„±μžλ„ λ§ˆμ°¬κ°€μ§€λ‘œ μ˜€λ²„λ‘œλ”©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€. μƒμ„±μžλ₯Ό λ”°λ‘œ κ΅¬ν˜„ν•˜κ²Œ 되면 κΈ°λ³Έ μƒμ„±μžκ°€ μ œκ³΅λ˜μ§€ μ•ŠμœΌλ―€λ‘œ ν•„μš”μ‹œ 직접 μƒμ„±ν•΄μ„œ μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€. μƒμ„±μžλ„ μ—­μ‹œ μ˜€λ²„λ‘œλ”©μ΄ μ„±λ¦½ν•˜κΈ° μœ„ν•΄μ„œ 쑰건이 ν•„μš”ν•œλ° λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ˜ 쑰건과 κ°™μŠ΅λ‹ˆλ‹€.

  • λ©”μ„œλ“œ 이름이 κ°™μ•„μ•Ό 함
  • λ§€κ°œλ³€μˆ˜μ˜ 개수 λ˜λŠ” νƒ€μž…μ΄ 달라야함
class Card {
	int cardNum;

    Card() {}

    Card(int cardNum) {
    this.cardNum = cardNum;
    }
}

5. this(), this

1. this()

같은 클래슀 λ‚΄μ˜ λ©”μ„œλ“œλ“€λΌλ¦¬ μ„œλ‘œ ν˜ΈμΆœν•  수 μžˆλŠ” 것 처럼 μƒμ„±μžλ„ this()λ₯Ό μ‚¬μš©ν•΄μ„œ μƒν˜Έ 호좜이 κ°€λŠ₯ν•©λ‹ˆλ‹€. this()λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ 두 κ°€μ§€ 쑰건을 λ§Œμ‘±ν•΄μ•Ό ν•˜λŠ”λ° λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • λ°˜λ“œμ‹œ 첫 쀄에 μœ„μΉ˜ν•΄μ•Όν•¨
  • μƒμ„±μžμ˜ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©κ°€λŠ₯
public class ClassThis {
	public static void main(String[] args) {
    	ThisEx ex1 = new ThisEx();
        ThisEx ex2 = new ThisEx("Kim");
    }
}

class ThisEx {
	public ThisEx() {
    	System.out.println("ThisEx의 κΈ°λ³Έμƒμ„±μž 호좜");
    }

    public ThisEx(String str) {
    	this();
        System.out.printf("%sλ‹˜μ΄ ThisEx의 두 번째 μƒμ„±μžλ₯Ό 호좜", str);
    }
}

/* ====== Result ======
ThisEx의 κΈ°λ³Έμƒμ„±μž 호좜
ThisEx의 κΈ°λ³Έμƒμ„±μž 호좜
Kimλ‹˜μ΄ ThisEx의 두 번째 μƒμ„±μžλ₯Ό 호좜
======================= */

class ThisExλŠ” 두 개의 μƒμ„±μžλ₯Ό κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. κΈ°λ³Έμƒμ„±μž 1κ°œμ™€ λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μž 1개 μž…λ‹ˆλ‹€. λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” 두 번째 μƒμ„±μžμ—λŠ” λ‚΄λΆ€μ˜ 첫 번째 쀄에 this()κ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

'result'μ—μ„œ 확인할 수 μžˆλ“―μ΄ λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžλ₯Ό 호좜 ν–ˆμ„ λ•Œ this()의 μˆ˜ν–‰μœΌλ‘œ 첫 번째 μƒμ„±μžμ˜ ThisEx의 κΈ°λ³Έ μƒμ„±μž 호좜"이 λ¨Όμ € 좜λ ₯되고 두 번째 μƒμ„±μžμ˜ Kimλ‹˜μ΄ ThisEx의 두 번째 μƒμ„±μžλ₯Ό 호좜"이 호좜 된 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

2. this

thisν‚€μ›Œλ“œλŠ” λ¨Όμ € 예제λ₯Ό 보고 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

class CustomerInfo {
	private static long customerId;
    private String customerName;
    private String address;
    private int age;

	CustomerInfo (String customerName, String address, int age) {
		long customerID = customerId++;
    	this.customerName = customerName;
    	this.address = address;
        this.age = age;
    }

    void printInfo() {
    	System.out.printf("%sλ‹˜μ€ %s에 κ±°μ£Όν•˜κ³  %dμ„Έ μž…λ‹ˆλ‹€. customerId = %d", customerName, address, age, customerId);
    }
}

public class ThisEx2 {
	public static void main(String[] args) {
    	CustomerInfo kim = new CustomerInfo("kim", "μ„œμšΈ", 10);
        kim.printinfo();
    }
}

μ˜ˆμ œμ—μ„œ λ³Ό 수 μžˆλ“―μ΄ class CustomerInfo에 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ customerId, customerName, address, ageκ°€ 있고 μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜λ‘œ customerName, address, ageκ°€ μžˆμŠ΅λ‹ˆλ‹€.

이런 κ²½μš°μ— μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ λ§€κ°œλ³€μˆ˜λ₯Ό μ΄λ¦„μœΌλ‘œ κ΅¬λΆ„ν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€. μ΄λ•Œ 이λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 것이 thisμž…λ‹ˆλ‹€. μœ„μ˜ μƒμ„±μžμ—μ„œ this.customerName = customerNameμ—μ„œ 'this'λ₯Ό μ§€μš°κ³  μž‘μ„±ν•˜λ©΄ 두 λ³€μˆ˜ λͺ¨λ‘ μ§€μ—­λ³€μˆ˜λ‘œ κ°„μ£Όλ©λ‹ˆλ‹€.

thisλŠ” μΈμŠ€ν„΄μŠ€ μžμ‹ μ„ 가리킀며, thisλ₯Ό ν†΅ν•΄μ„œ μΈμŠ€ν„΄μŠ€ μžμ‹ μ˜ λ³€μˆ˜μ— μ ‘κ·Όν•©λ‹ˆλ‹€.

6. λ‚΄λΆ€ 클래슀

λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” 클래슀 내에 μ„ μ–Έλœ 클래슀둜, μ™ΈλΆ€ ν΄λž˜μŠ€μ™€ λ‚΄λΆ€ ν΄λž˜μŠ€κ°€ μ„œλ‘œ μ—°κ΄€λ˜μ–΄ μžˆμ„ λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. λ‚΄λΆ€ 클래슀λ₯Ό μ΄μš©ν•˜λ©΄ μ™ΈλΆ€ 클래슀의 멀버에 μ‰½κ²Œ μ ‘κ·Όν•  수 있고 μ½”λ“œμ˜ λ³΅μž‘μ„±(μΊ‘μŠν™”)을 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚΄λΆ€ 클래슀의 μ’…λ₯˜λŠ” μΈμŠ€ν„΄μŠ€ λ‚΄λΆ€ 클래슀, 정적 λ‚΄λΆ€ 클래슀, μ§€μ—­ λ‚΄λΆ€ 클래슀, 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

class a {
	class b {
    	// μΈμŠ€ν„΄μŠ€ λ‚΄λΆ€ 클래슀
    }
    static class c {
    	// 정적 λ‚΄λΆ€ 클래슀
    }
    void methodEx() {
    	class d {
        	//	μ§€μ—­ λ‚΄λΆ€ 클래슀
        }
    }
}

1. μΈμŠ€ν„΄μŠ€, 정적, μ§€μ—­ λ‚΄λΆ€ 클래슀의 비ꡐ

μ’…λ₯˜ μ„ μ–Έ μœ„μΉ˜ μ‚¬μš© κ°€λŠ₯ν•œ λ³€μˆ˜
μΈμŠ€ν„΄μŠ€ λ‚΄λΆ€ 클래슀 μ™ΈλΆ€ 클래슀의 λ©€λ²„λ³€μˆ˜ μœ„μΉ˜ μ™ΈλΆ€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, μ™ΈλΆ€ μ „μ—­ λ³€μˆ˜
정적 λ‚΄λΆ€ 클래슀 μ™ΈλΆ€ 클래슀의 멀버 λ³€μˆ˜ μ™ΈλΆ€ μ „μ—­ λ³€μˆ˜
μ§€μ—­ λ‚΄λΆ€ 클래슀 μ™ΈλΆ€ 클래슀의 λ©”μ„œλ“œ ν˜Ήμ€ μ΄ˆκΈ°ν™” λΈ”λŸ­ μ™ΈλΆ€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, μ™ΈλΆ€ μ „μ—­ λ³€μˆ˜

πŸ“š Reference