λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Study/Java

μžλ°”ν”„λ‘œκ·Έλž˜λ° 3μ£Όμ°¨ 정리

μˆ˜μ—…λ‚ μ§œ/μ •λ¦¬λ‚ μ§œ

2022.03.22 / 2022.03.27

 

ν•™μŠ΅μ£Όμ œ - 객체지ν–₯
  • 05 클래슀, 객체, λ©”μ†Œλ“œ
  • 06 클래슀, λ©”μ†Œλ“œ 심측연ꡬ

 

ν•™μŠ΅λ‚΄μš©

05 클래슀, 객체, λ©”μ†Œλ“œ

객체(Object)

  • μƒνƒœ(state): 객체의 νŠΉμ§•(속성)
  • λ™μž‘(behavior): 객체의 행동(κΈ°λŠ₯)
μƒνƒœ → 멀버 λ³€μˆ˜ (μžλ°” μš©μ–΄: ν•„λ“œ)
λ™μž‘, κΈ°λŠ₯, ν–‰μœ„ → 멀버 ν•¨μˆ˜ (μžλ°” μš©μ–΄: λ©”μ†Œλ“œ)

 

클래슀

  • 클래슀: 객체λ₯Ό λ§Œλ“œλŠ” 섀계도
  • 객체: 클래슀의 instance
더보기

- ν΄λž˜μŠ€λŠ” 객체λ₯Ό μ°μ–΄λ‚΄λŠ” ν‹€κ³Ό κ°™λ‹€.

- ν΄λž˜μŠ€λŠ” μ‹€ν–‰μ½”λ“œκ°€ μ•„λ‹˜ → λ°˜λ“œμ‹œ 객체 생성을 ν•΄μ•Ό 함

 

클래슀의 ꡬ쑰

class ν΄λž˜μŠ€μ΄λ¦„ {
	μžλ£Œν˜• ν•„λ“œ1;
    μžλ£Œν˜• ν•„λ“œ2;
    ...
    
    λ°˜ν™˜ν˜• λ©”μ†Œλ“œ1()	...}
    λ°˜ν™˜ν˜• λ©”μ†Œλ“œ2()	...}
    ...
}			// C++μ—μ„œλŠ” 뒀에 ;ν•„μš”, μžλ°”λŠ” ν•„μš”x

클래슀 μ•ˆμ—λŠ” ν•„λ“œμ™€ λ©”μ†Œλ“œλ“€μ΄ μ •μ˜λœλ‹€. 이듀은 클래슀의 멀버라고 뢈림

 

객체 μ°Έμ‘° λ³€μˆ˜

  • 기초 λ³€μˆ˜(μ •μˆ˜/μ‹€μˆ˜/문자/논리): μ‹€μ œ 데이터 κ°’ μ €μž₯
  • μ°Έμ‘° λ³€μˆ˜(객체/λ°°μ—΄/λ¬Έμžμ—΄): 객체의 μ°Έμ‘° μ €μž₯

 

λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”©

  • 같은 μ΄λ¦„μ˜ λ©”μ†Œλ“œκ°€ μ—¬λŸ¬ 개 μ‘΄μž¬ν•œλ‹€.

β€» μ˜€λ²„λ‘œλ”© → ν•¨μˆ˜ 이름이 κ°™κ³ , λ§€κ°œλ³€μˆ˜κ°€ 닀름

 

UML

  • 객체지ν–₯섀계에 μ‚¬μš©λ˜λŠ” λͺ¨λΈλ§ 언어이닀.
  • μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μž‘μ„±ν•˜κΈ° 전에 μ‹œκ°ν™”ν•˜μ—¬ κ²€ν† ν•œλ‹€.
Car ←클래슀의 이름은 적어쀀닀.
-speed: int
- gear: int
- color: String
← 클래슀의 속성을 λ‚˜νƒ€λ‚Έλ‹€.
즉, ν•„λ“œλ₯Ό 적어쀀닀.
+ speedUp(): void
+ speedDown(): void
← 클래슀의 λ™μž‘μ„ λ‚˜νƒ€λ‚Έλ‹€.
즉, λ©”μ†Œλ“œλ₯Ό 적어쀀닀.
  • κ°€μ‹œμ„± ν‘œμ‹œμž → ν•„λ“œλ‚˜ λ©”μ†Œλ“œμ˜ 이름 μ•žμ—λŠ” κ°€μ‹œμ„± ν‘œμ§€μžκ°€ 올 수 있음
+ Public
- Private
# Protected
/ Derived
~ Package

클래슀 κ°„μ˜ 관계: UMLμ—μ„œ UMLμ—μ„œ μ‚¬μš©λ˜λŠ” ν™”μ‚΄ν‘œ μ’…λ₯˜

ꡐ재 이미지 μ°Έκ³ 

String 클래슀

  • λ¬Έμžμ—΄μ€ μ°Έμ‘°ν˜• 자료 객체이닀.
  • λ¬Έμžμ—΄μ„ μ €μž₯ν•˜κ³  μ²˜λ¦¬ν•˜λŠ” String 클래슀λ₯Ό μ‚¬μš©ν•œλ‹€.

β€» String 클래슀 → μžλ£Œν˜•μ˜ 성격/ν΄λž˜μŠ€μ§€λ§Œ 마치 μžλ£Œν˜•μΈ λ“―, λ¬Έμžμ—΄μΈ λ“― μ‚¬μš©

 

 

String 클래슀의 객체 생성

String s = new String("Hello Wolrd!");
// String s = "Hello World!";​

 

String 클래슀의 λ©”μ†Œλ“œ

μžλ°” API λ¬Έμ„œμ—μ„œ String 클래슀의 λ©”μ†Œλ“œλ“€μ„ μ°Ύμ•„λ³Ό 수 μžˆλ‹€.

더보기

ex)

charAt(int index) // μ§€μ •λœ μΈλ±μŠ€μ— μžˆλŠ” 문자λ₯Ό λ°˜ν™˜

s.charAt(1)  // 1번째 자리 κ°’ λ°˜ν™˜, Hello World!μ—μ„œ eκ°€ λ°˜ν™˜λ¨ 

 

λ¬Έμžμ—΄μ˜ κ²°ν•©

+ μ—°μ‚°μž μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

 

μˆ˜μΉ˜κ°’ → λ¬Έμžμ—΄

λ¬Έμžμ—΄κ³Ό 기초 μžλ£Œν˜• λ³€μˆ˜λŠ” κ²°ν•© κ°€λŠ₯ν•˜λ‹€.

// λ¬Έμžμ—΄λ‘œ λ³€ν™˜(μžλ™ ν˜•λ³€ν™˜)
int x = 20;
System.out.println("결과값은 " + x);		// "결과값은 20"이 좜λ ₯λœλ‹€.
String answer = "The answer is " + 100; // "The answer is 100"

// λͺ…μ‹œμ  ν˜•λ³€ν™˜
String answer = "The answer is ";
answer = answer + String.valueOf(100);	// "The answer is 100"	// valueOf: λ¬Έμžμ—΄μ„ λ³€ν™˜ν•΄μ£ΌλŠ” λ©”μ†Œλ“œ

 

λ¬Έμžμ—΄ → μˆ˜μΉ˜κ°’

λ¬Έμžμ—΄μ„ 기초 μžλ£Œν˜•μœΌλ‘œ λ³€ν™˜ν•œλ‹€.

각 wrapper 클래슀의 parseXXX() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

int i = Integer.parseInt("123");		// int: 기초 μžλ£Œν˜•, Integer: 랩퍼 클래슀
double d = Double.parseDouble("3.141592");	// double: 기초 μžλ£Œν˜•, Double: 랩퍼 클래슀

 


06 클래슀, λ©”μ†Œλ“œ 심측연ꡬ

μ ‘κ·Όμ œμ–΄

μ™ΈλΆ€μ—μ„œ νŠΉμ • ν•„λ“œλ‚˜ λ©”μ†Œλ“œμ— μ ‘κ·Όν•˜λŠ” κΆŒν•œμ„ μ„€μ •ν•œλ‹€.

μ ‘κ·Ό μ§€μ •μž 클래슀 νŒ¨ν‚€μ§€ μžμ‹ 클래슀 전체 세계
public O O O O
protected O O O X
μ—†μŒ O O X X
private O X X X

 

μ„€μ •μžμ™€ μ ‘κ·Όμž

μ ‘κ·Όμž(λ°˜ν™˜μž, getter)

  • ν•„λ“œμ˜ 값을 λ°˜ν™˜ν•˜λŠ” λ©”μ†Œλ“œ
  • getXXX() ν˜•μ‹

μ„€μ •μž(λ³€κ²½μž, setter)

  • ν•„λ“œμ˜ 값을 μ„€μ •ν•˜λŠ” λ©”μ†Œλ“œ
  • setXXX()ν˜•μ‹

 

μƒμ„±μž

객체 생성 μ‹œ, ν•„λ“œ μ΄ˆκΈ°ν™” λ“±μ˜ μ΄ˆκΈ°ν™” 절차λ₯Ό μ‹€ν–‰ν•˜λŠ” λ©”μ†Œλ“œ

public class Car{
	Car() {		// 2~4 - μƒμ„±μž: 클래슀 이름과 λ™μΌν•œ λ©”μ†Œλ“œ
    	...		// 객체 μ΄ˆκΈ°ν™” λ‹΄λ‹Ή
    }
}

 

 

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

μƒμ„±μžλ„ λ©”μ†Œλ“œμ˜ ν•œ μ’…λ₯˜μ΄λ‹€.

→ λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”©κ³Ό μƒμ„±μž μ˜€λ²„λ‘œλ”©μ€ 동일!!

 

this둜 ν˜„μž¬ 객체 λ‚˜νƒ€λ‚΄κΈ°

public class Point{
	public int x = 0;
    public int y = 0;
    
    // μƒμ„±μž
    public Point(int x, int y){
    	this.x = x;
        this.y = y;
    }
}

C++μ—μ„œλŠ” 'this->멀버'라고 ν•˜μ§€λ§Œ μžλ°”μ—μ„œλŠ” this.멀버

7~8μ€„μ˜ this.x와 this.yλŠ” 2~3μ€„μ˜ public int x =0, public int y = 0을 의미

7~8μ€„μ˜ x와 yλŠ” μƒμ„±μž Point의 λ§€κ°œλ³€μˆ˜ int x와 int yλ₯Ό 의미

 

ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” λ‹€λ₯Έ 방법

β‘  ν•„λ“œ μ„ μ–Έ μ‹œ μ΄ˆκΈ°ν™”

public class Hotel{
    public int capacity = 10;	// 10으둜 μ΄ˆκΈ°ν™”
    private boolean full = false;	// false둜 μ΄ˆκΈ°ν™”
    ..
}

 

β‘‘ μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” 블둝

  • μ΄ˆκΈ°ν™” λΈ”λ‘μ˜ λ‚΄μš©μ΄ μƒμ„±μžλ“€μ— λ³΅μ‚¬λœλ‹€.
  • μ—¬λŸ¬ μƒμ„±μžκ°€ λ™μΌν•œ μ½”λ“œλ₯Ό κ³΅μœ ν•  μ‹œ, 무λͺ…ν΄λž˜μŠ€μ—μ„œ μœ μš©ν•˜λ‹€.
public class Car{
	int speed;
    Car(){System.out.println("μ†λ„λŠ” " + speed);}
    {					// 4~6쀄: μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” 블둝
    	speed = 100;
    }
    public static void main(String args[]){
    	Car c1 = new Car();
        Car c2 = new Car();
    }}

 

λ©”μ†Œλ“œλ‘œ 객체 전달/λ°˜ν™˜

μžλ°”μ—μ„œ μΈμˆ˜μ—μ„œ 맀개 λ³€μˆ˜λ‘œ 값이 μ „λ‹¬λ˜λŠ” 방법은 기본적으둜 "값에 μ˜ν•œ 호좜(call-by-value)"이닀.

β€» 값에 μ˜ν•œ 호좜: 인수의 값이 λ³΅μ‚¬λ˜μ–΄ 맀개 λ³€μˆ˜λ‘œ μ „λ‹¬λ˜λŠ” 방식

 

기초 λ³€μˆ˜ 전달(κ°’ 볡사)

  • λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 변경해도 μ „λ‹¬λœ 인수(x)λŠ” λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.

μ°Έμ‘° λ³€μˆ˜ 전달(μ°Έμ‘° 볡사)

  • μ°Έμ‘° λ³€μˆ˜μ˜ 값이 λ³΅μ‚¬λ˜μ–΄ 맀개 λ³€μˆ˜λ‘œ μ „λ‹¬λœλ‹€.
  • λ”°λΌμ„œ μΈμˆ˜μ™€ 맀개 λ³€μˆ˜ λͺ¨λ‘ λ™μΌν•œ 객체λ₯Ό κ°€λ¦¬ν‚€κ²Œ λœλ‹€.
더보기
  • 맀개 λ³€μˆ˜λ₯Ό ν†΅ν•˜μ—¬ 객체의 λ‚΄μš©μ„ λ³€κ²½ν•˜κ²Œ 된면 μΈμˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” 객체가 λ³€κ²½λœλ‹€.

β€» λ°°μ—΄μ˜ μ „λ‹¬λ˜λŠ” 경우

  • 배열을 맀개 λ³€μˆ˜λ‘œ λ°›μ•„μ•Ό ν•œλ‹€.
  • μžλ°”μ—μ„œλŠ” 배열도 객체이기 λ•Œλ¬Έμ— 객체 전달과 λ™μΌν•˜κ²Œ μ²˜λ¦¬λœλ‹€.
  • 즉, 배열이 μ „λ‹¬λ˜λŠ” 것이 μ•„λ‹Œ 배열을 κ°€λ¦¬ν‚€λŠ” 참쑰값이 λ³΅μ‚¬λ˜κ³  λ©”μ†Œλ“œμ—μ„œ 맀개 λ³€μˆ˜λ₯Ό ν†΅ν•˜μ—¬ 배열을 λ³€κ²½ν•˜λ©΄ 원본 배열이 λ³€κ²½λœλ‹€.

 

정적 멀버(static member)

  • μ˜ˆμ•½μ–΄ static을 μ‚¬μš©ν•œλ‹€.
  • 정적 λ©€λ²„λŠ” ν•˜λ‚˜λ§Œ μƒμ„±λœλ‹€.
  • λͺ¨λ“  객체가 κ³΅μœ λœλ‹€.
  • 클래슀 μ΄λ¦„μœΌλ‘œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.

 

클래슀의 λ©€λ²„λŠ” μΈμŠ€ν„΄μŠ€ 멀버와 정적 λ©€λ²„λ‘œ λ‚˜λˆ„μ–΄μ§„λ‹€.

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜

λ™μΌν•œ 클래슀λ₯Ό μ΄μš©ν•˜μ—¬ λ§Žμ€ 객체듀이 생성될 λ•Œ 각각의 객체(μΈμŠ€ν„΄μŠ€)듀은 μžμ‹ λ§Œμ˜ λ³€μˆ˜λ₯Ό κ°€μ§€λŠ”λ° 이듀 λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ λ³„λ„λ‘œ μƒμ„±λ˜κΈ° λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(instance variable)라고도 ν•œλ‹€.

 

정적 λ³€μˆ˜

κ²½μš°μ— 따라 λͺ¨λ“  객체에 곡톡인 λ³€μˆ˜κ°€ ν•„μš”ν•œ κ²½μš°λ„ μžˆλŠ”λ° 이것이 정적 λ³€μˆ˜(static variable)이닀.

정적 λ³€μˆ˜λŠ” ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ— ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•œλ‹€.

더보기
  • 정적 λ³€μˆ˜λŠ” 클래슀 λ³€μˆ˜λΌκ³ λ„ ν•œλ‹€.
  • λͺ¨λ“  객체듀은 ν•˜λ‚˜μ˜ 정적 λ³€μˆ˜λ₯Ό κ³΅μœ ν•œλ‹€.
  • 정적 λ³€μˆ˜λ₯Ό λ§Œλ“€λ €λ©΄ λ³€μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ μ•žμ— static을 뢙이면 λœλ‹€.
  • 정적 λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

 

정적 λ©”μ†Œλ“œ

  • μ˜ˆμ•½μ–΄ static을 μ‚¬μš©ν•œλ‹€.
  • 클래슀 μ΄λ¦„μœΌλ‘œ ν˜ΈμΆœν•  수 μžˆλ‹€.
  • ex) double value = Math.sqrt(9.0)
더보기

β€» 정적 λ©€λ²„λŠ” 클래슀 μ΄λ¦„μœΌλ‘œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.

→ 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ μ“Έ 수 μžˆλ‹€. (클래슀 μ΄λ¦„λ§Œ 가지고 호좜 κ°€λŠ₯ν•˜λ‹€.)

→ ex) Math.random()

 

λ‚΄μž₯ 클래슀

클래슀 λ‚΄λΆ€μ—μ„œ μ •μ˜λœ 클래슀λ₯Ό λ§ν•œλ‹€.

class OuterClass{
	...		// ν•„λ“œ, λ©”μ†Œλ“œ
    class NestedClass{
    	...		// ν•„λ“œ, λ©”μ†Œλ“œ
    }
}
더보기

β€» NestedClass: ν¬ν•¨λœ 클래슀

- μ™ΈλΆ€ 클래슀 pirvate에 μš©μ΄ν•˜κΈ° λ•Œλ¬Έμ— μ‚¬μš©.

- λ³΅μž‘ν•œ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ ν•˜μš©

 


ν•™μŠ΅λ‚΄μš© 이해도

90%정도. λŒ€λΆ€λΆ„ 배운 λ‚΄μš©μ„ λ³΅μŠ΅ν•˜λ©° 이해할 수 μžˆμ—ˆμ§€λ§Œ, 객체 μ°Έμ‘° 뢀뢄이 쑰금 λΆ€μ‘±ν•œ 것 κ°™λ‹€.

 

ν•™μŠ΅ν™œλ™ λŒμ•„λ³΄κΈ°

μˆ˜μ—…μ—μ„œ 배운 λ‚΄μš©μ„ 곡뢀할 λ•Œ ν•„κΈ°ν•œ 것을 λ°”νƒ•μœΌλ‘œ μ±…κ³Ό ν•¨κ»˜ λ³Έλ‹€. μ΄λ²ˆμ— 처음 λŒ€λ©΄ μˆ˜μ—…μ„ ν•΄μ„œ λΉ„λŒ€λ©΄ λ…Ήν™”κ°•μ˜λ‘œ μˆ˜μ—…μ„ ν–ˆμ„ λ•Œμ™€λŠ” λ‹¬λžλ‹€. λ…Ήν™” κ°•μ˜λŠ” λͺ¨λ₯΄λŠ” λΆ€λΆ„μ˜ 경우 돌렀 λ³Ό 수 μžˆμ§€λ§Œ, λŒ€λ©΄μœΌλ‘œ ν•„κΈ°λ₯Ό ν•˜κ³  그것을 λ°”νƒ•μœΌλ‘œ κ³΅λΆ€ν•˜λ €κ³  ν•˜λ‹ˆ 쑰금 어렡기도 ν–ˆλ‹€.

C++μ—μ„œ 배운 λ‚΄μš©μ„ 더 ν™•μž₯ν•˜λŠ” λŠλ‚Œμ΄μ—ˆλ‹€. 사싀 C++이 μ’€ κ°€λ¬Όκ°€λ¬Όν•˜λ‹€.. 

μžλ°”μ—μ„œ 포인터가 μ—†λ‹€λŠ” 것을 μ•Œκ³  쑰금 기뻀닀..γ…Žγ…Ž

 

λ‹€μŒ ν•™μŠ΅κ³„νš

상속과 λ‹€ν˜•μ„±