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

🍌 클래슀

클래슀

  • 객체λ₯Ό μ •μ˜ν•΄ 놓은 것
  • 객체의 섀계도 λ˜λŠ” ν‹€
  • 객체λ₯Ό μƒμ„±ν•˜λŠ”λ° μ‚¬μš©λ¨

클래슀λ₯Ό μ •μ˜ν•˜λŠ” 방법

ν΄λž˜μŠ€λž€ 객체λ₯Ό μ •μ˜ν•œ κ²ƒμ΄λ―€λ‘œ, ν΄λž˜μŠ€μ—λŠ” 객체의 λͺ¨λ“  속성과 κΈ°λŠ₯이 μ •μ˜λ˜μ–΄ μžˆλ‹€.

class Tv {
    // 속성(λ³€μˆ˜)
    String color; 
    boolean power; 
    int channel;

    // κΈ°λŠ₯(λ©”μ„œλ“œ)
    void power() { power = !power; }
    void channelUp() { channel++; }
    void channelDown() { channel--; }

🍌 객체

객체

  • μ‹€μ œλ‘œ μ‘΄μž¬ν•˜λŠ” 것. 사물 λ˜λŠ” κ°œλ…
  • 객체의 μš©λ„λŠ” 객체가 가지고 μžˆλŠ” κΈ°λŠ₯κ³Ό 속성에 따라 닀름
  • ν΄λž˜μŠ€μ— μ •μ˜λœ λ‚΄μš©λŒ€λ‘œ λ©”λͺ¨λ¦¬μ— μƒμ„±λœ 것

객체 λ§Œλ“œλŠ” 방법

μΈμŠ€ν„΄μŠ€ν™”

  • ν΄λž˜μŠ€λ‘œλΆ€ν„° 객체λ₯Ό λ§Œλ“œλŠ” κ³Όμ •
  • μ–΄λ–€ ν΄λž˜μŠ€λ‘œλΆ€ν„° λ§Œλ“€μ–΄μ§„ 객체λ₯Ό κ·Έ 클래슀의 μΈμŠ€ν„΄μŠ€λΌκ³  ν•œλ‹€.

객체 : λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ₯Ό λŒ€ν‘œν•˜λŠ” 포괄적인 의미
μΈμŠ€ν„΄μŠ€ : μ–΄λ–€ ν΄λž˜μŠ€λ‘œλΆ€ν„° λ§Œλ“€μ–΄μ§„ 것인지λ₯Ό κ°•μ‘°ν•˜λŠ” 보닀 ꡬ체적인 의미

 

객체의 ꡬ성 μš”μ†Œ

  • 속성(property)
    • λ©€λ²„λ³€μˆ˜(member variable), νŠΉμ„±(attribute), ν•„λ“œ(field), μƒνƒœ(state)
  • κΈ°λŠ₯(function )
    • λ©”μ„œλ“œ(method), ν•¨μˆ˜(function), ν–‰μœ„(behavior)
클래슀λͺ… λ³€μˆ˜λͺ…; // 클래슀의 객체λ₯Ό μ°Έμ‘°ν•˜κΈ° μœ„ν•œ μ°Έμ‘°λ³€μˆ˜λ₯Ό μ„ μ–Έ
λ³€μˆ˜λͺ… = new 클래슀λͺ…(); // 클래슀의 객체λ₯Ό 생성 ν›„, 객체의 μ£Όμ†Œλ₯Ό μ°Έμ‘°λ³€μˆ˜μ— μ €μž₯
Tv t; // Tv 클래슀 νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜ tλ₯Ό μ„ μ–Έ
t = new Tv(); // TvμΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œ ν›„, μƒμ„±λœ Tv μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œλ₯Ό t에 μ €μž₯

예)

class Tv {
    String color;
    boolean power;
    int channel;

    void power() { power = !power; }
    void channelUp() { ++channel; }
    void channelDown() { --channel; }
}

public class TvTest {
    public static void main(String[] args) {
        Tv t;
        t = new Tv();
        t.channel = 7;
        t.channelDown();
        System.out.println("ν˜„μž¬ 채널은 " + t.channel + "μž…λ‹ˆλ‹€.");
    }
}

new μ—°μ‚°μž

클래슀 λ³€μˆ˜ = new 클래슀();

μΈμŠ€ν„΄μŠ€(객체)λ₯Ό μƒμ„±ν•΄μ£ΌλŠ” μ—­ν• 

λ©”λͺ¨λ¦¬(Heap μ˜μ—­)에 데이터λ₯Ό μ €μž₯ν•  곡간을 ν• λ‹Ήλ°›κ³ 

κ·Έ κ³΅κ°„μ˜ 참쑰값을 κ°μ²΄μ—κ²Œ λ°˜ν™˜ν•˜μ—¬ μ£Όκ³  μ΄μ–΄μ„œ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€.

 

 

🍌 λ©”μ„œλ“œ

λ©”μ„œλ“œ
νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 일련의 λ¬Έμž₯듀을 ν•˜λ‚˜λ‘œ 묢은 것

λ©”μ„œλ“œ μ •μ˜ν•˜λŠ” 방법

λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œ 이름(νƒ€μž… λ³€μˆ˜λͺ…, νƒ€μž… λ³€μˆ˜λͺ…, ...) // μ„ μ–ΈλΆ€
{
    // λ©”μ„œλ“œ 호좜 μ‹œ μˆ˜ν–‰λ  μ½”λ“œ // κ΅¬ν˜„λΆ€
}

 

int add(int a, int b) // μ„ μ–ΈλΆ€
{
    // κ΅¬ν˜„λΆ€
    int result = a + b;
    return result; // ν˜ΈμΆœν•œ λ©”μ„œλ“œλ‘œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λ‹€.
}

λ©”μ„œλ“œ μ„ μ–ΈλΆ€

λ°˜ν™˜νƒ€μž…, λ©”μ„œλ“œ 이름, λ§€κ°œλ³€μˆ˜ μ„ μ–ΈμœΌλ‘œ κ΅¬μ„±λ˜μ–΄ 있음.

λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œ 이름(맀개 λ³€μˆ˜ μ„ μ–Έ) {};
int add(int x, inty) {};

πŸ’‘ μ°Έκ³  - 인자(argument) 와 λ§€κ°œλ³€μˆ˜(parameter)

  • 인자(argument)
    • λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ κ΄„ν˜Έ μ•ˆμ— 지정해쀀 κ°’
  • λ§€κ°œλ³€μˆ˜(parameter)
    • λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•  λ•Œ μ •μ˜ν•œ 것

 

λ©”μ„œλ“œ κ΅¬ν˜„λΆ€

λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜μ—ˆμ„ λ•Œ μˆ˜ν–‰λ  λ¬Έμž₯
λ©”μ„œλ“œμ˜ λ°˜ν™˜νƒ€μž…μ΄ voidκ°€ μ•„λ‹Œ 경우, κ΅¬ν˜„λΆ€ μ•ˆμ— return λ°˜ν™˜κ°’μ΄ λ°˜λ“œμ‹œ ν¬ν•¨λ˜μ–΄ μžˆμ–΄μ•Όν•œλ‹€.

🍌 μƒμ„±μž

μΈμŠ€ν„΄νŠΈκ°€ 생성될 λ•Œ ν˜ΈμΆœλ˜λŠ” μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λ©”μ„œλ“œ
μ—¬κΈ°μ„œ μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™”λž€, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ“€μ„ μ΄ˆκΈ°ν™”ν•˜λŠ” 것을 λœ»ν•œλ‹€.

🚨 μ—°μ‚°μž newκ°€ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것이지 μƒμ„±μžκ°€ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것이 μ•„λ‹ˆλ‹€.

  • μΈμŠ€ν„΄μŠ€ 생성 κ³Όμ •
    1. μ—°μ‚°μž new에 μ˜ν•΄μ„œ λ©”λͺ¨λ¦¬(heap)에 Card클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœλ‹€.
    2. μƒμ„±μž Card()κ°€ ν˜ΈμΆœλ˜μ–΄ μˆ˜ν–‰λœλ‹€.
    3. μ—°μ‚°μž new의 결과둜, μƒμ„±λœ Card μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œκ°€ λ°˜ν™˜λ˜μ–΄ μ°Έμ‘°λ³€μˆ˜ c에 μ €μž₯λœλ‹€.
  • Card c = new Card();

μƒμ„±μžμ˜ 쑰건

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

μƒμ„±μž μ •μ˜ν•˜λŠ” 방법

κΈ°λ³Έ μƒμ„±μž

ν΄λž˜μŠ€μ΄λ¦„() {}
Card() {}

λͺ¨λ“  ν΄λž˜μŠ€μ—λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜ μ΄μƒμ˜ μƒμ„±μžκ°€ μ •μ˜λ˜μ–΄ μžˆμ–΄μ•Όν•œλ‹€.
μƒμ„±μžκ°€ μ •μ˜λ˜μ–΄ μžˆμ§€ μ•Šμ„ 경우, μ»΄νŒŒμΌλŸ¬κ°€ κΈ°λ³Έμƒμ„±μžλ₯Ό μΆ”κ°€ν•΄μ„œ 컴파일 ν•œλ‹€.

κΈ°λ³Έ μƒμ„±μžλŠ” μœ„μ™€ 같이 아무 λ§€κ°œλ³€μˆ˜λ„, 아무 λ‚΄μš©λ„ μ—†λŠ” 것을 λ§ν•œλ‹€.

 

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

λ§κ·ΈλŒ€λ‘œ λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžλ‹€.
μƒμ„±μžλ„ λ©”μ†Œλ“œ 처럼 λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•˜μ—¬ 호좜 μ‹œ 값을 λ„˜κ²¨ λ°›μ•„μ„œ μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” μž‘μ—…μ— μ‚¬μš©λ  수 μžˆλ‹€.

ex)

class Car {
    String color;
    String gearType;
    int door; 

    Car() {} // κΈ°λ³Έ μƒμ„±μž
    Car(String c, String g, int d) { // μƒμ„±μž    
        color = c;
        gearType = g;
        door = d;
    }
}
// μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ
Car c = new Car();
c.color = "white";
c.grearType = "auto";
c.door = 4;
// μƒμ„±μž μ‚¬μš© μ‹œ
Car c = new Car("white", "auto", 4);

 

🍌 this

JAVAμ—μ„œ thisλŠ” 객체, μžκΈ°μžμ‹ μ„ λ‚˜νƒ€λ‚Έλ‹€.
thisλ₯Ό μ‚¬μš©ν•˜λŠ” 상황은 크게 3가지가 μžˆλ‹€.

1. 클래슀의 속성과 μƒμ„±μž/ λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜μ˜ 이름이 같은 경우

thisλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ€ 예

public class Fruit {
    public String name;
    public String color;
    public double weihgt;
    public int count;

    public Fruit(String name, String color, double weight, int count) {
        name = name;
        color = color;
        weight = weight;
        count = count;
    }

    public static void main(String[] args) {
        Fruit banana = new Fruit("banana", "yellow", 5.0, 10);
        System.out.println("name: " + banana.name); // name: null
        System.out.println("color: " + banana.color); // color: null
        System.out.println("weight: " + banana.weihgt); // weight: 0.0
        System.out.println("count: " + banana.count); // count: 0
    }
}

일반적으둜 μƒμ„±μž λ˜λŠ” set/get λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜ 이름은 클래슀의 속성 이름과 λ™μΌν•˜κ²Œ μ μš©λœλ‹€.

 

μœ„μ—μ„œ λ³΄μ—¬μ§€λŠ” μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜ μ—­μ‹œ 클래슀 속성과 λ™μΌν•œ μ΄λ¦„μœΌλ‘œ μ •μ˜λ˜μ–΄ μžˆλ‹€.
그런데 main λ©”μ†Œλ“œμ—μ„œ Fruit 객체λ₯Ό μƒμ„±ν•˜κ³  속성 값듀을 좜λ ₯ν•΄λ³΄λ‹ˆ μ˜ˆμƒμΉ˜ λͺ»ν•œ κ²°κ³Όκ°€ λ‚˜νƒ€λ‚œλ‹€.
μ΄ˆκΈ°ν™”κ°€ 이루어 지지 μ•Šμ•˜λ‹€. ("banana", "yellow", 5.0, 10);라고 값을 μž…λ ₯ν–ˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³ .

 

μƒμ„±μžμ˜ κ΅¬ν˜„ λΆ€λΆ„μ—μ„œ name = name; 처럼 μ‚¬μš©ν•˜κ²Œ 되면
λ§€κ°œλ³€μˆ˜ name = λ§€κ°œλ³€μˆ˜ name ν˜•νƒœκ°€ λ˜μ–΄ Fruit 객체의 name μ†μ„±μ—λŠ” 값이 μž…λ ₯λ˜μ§€ μ•ŠλŠ”λ‹€.


즉, Java λŠ” 쒌츑의 name이 속성을 가리킀고 μžˆλ‹€λŠ” 사싀을 μΈμ§€ν•˜μ§€ λͺ»ν•œλ‹€.

이럴 λ•Œ this ν‚€μ›Œλ“œκ°€ μ‚¬μš©λœλ‹€.

public class Fruit {
    public String name;
    public String color;
    public double weight;
    public int count;

    public Fruit(String name, String color, double weight, int count) {
        this.name = name;
        this.color = color;
        this.weight = weight;
        this.count = count;
    }

    public static void main(String[] args) {
        Fruit banana = new Fruit("banana", "yellow", 5.0, 10);
        System.out.println("name: " + banana.name); // name: banana
        System.out.println("color: " + banana.color); // color: yellow
        System.out.println("weight: " + banana.weight); // weight: 5.0
        System.out.println("count: " + banana.count); // count: 10
    }
}

this.name = name; 은 Fruit 객체의 name 속성 = λ§€κ°œλ³€μˆ˜ name ν˜•νƒœκ°€ λ˜μ–΄ Fruit 객체의 속성이 값을 μž…λ ₯ν•˜κ²Œ λœλ‹€.

μ—¬κΈ°μ„œ this ν‚€μ›Œλ“œλŠ” 객체 μžμ‹ μ˜ 속성을 λ‚˜νƒ€λ‚΄κ²Œ λ˜λŠ” 것이닀.

2. ν΄λž˜μŠ€μ— μ˜€λ²„λ‘œλ”©λœ λ‹€λ₯Έ μƒμ„±μž 호좜

μƒμ„±μžμ˜ μ΅œμƒλ‹¨μ— μ‚¬μš©λ˜μ–΄μ•Ό ν•œλ‹€.

public class Fruit {
    public String name;
    public String color;
    public double weight;
    public int count;

    public Fruit(String name, String color) {
        // Fruit(String name, String color, double weight, int count)λ₯Ό 호좜
        this(name, color, 0.0, 0);
    }

    public Fruit(String name, String color, double weight, int count) {
        this.name = name;
        this.color = color;
        this.weight = weight;
        this.count = count;
    }

    public static void main(String[] args) {
        Fruit banana = new Fruit("banana", "yellow", 5.0, 10);
        System.out.println("name: " + banana.name); // name: banana
        System.out.println("color: " + banana.color); // color: yellow
        System.out.println("weight: " + banana.weight); // weight: 5.0
        System.out.println("count: " + banana.count); // count: 10
    }
}

ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ— μ—¬λŸ¬κ°œμ˜ μƒμ„±μžκ°€ μ˜€λ²„λ‘œλ”©λ˜μ–΄ μžˆμ„ λ•Œ
일뢀뢄을 μ œμ™Έν•˜κ³ λŠ” μ„œλ‘œ μ€‘λ³΅λœ μ½”λ“œλ₯Ό 가지고 μžˆλŠ” κ²½μš°κ°€ 많이 μžˆλ‹€.

μ˜€λ²„λ‘œλ”©

  • λ„ˆλ¬΄ 많이 μ μž¬ν–ˆλ‹€(Overloading)λŠ” 뜻
  • 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œμ— λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…, 개수λ₯Ό λ‹€λ₯΄κ²Œ ν•œ 것

이런 μˆœκ°„μ— 내뢀에 μ •μ˜λœ λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ½”λ“œμ˜ 쀑볡을 ν”Όν•˜κ³  κΉ”λ”ν•˜κ²Œ μ†ŒμŠ€λ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.
같은 ν΄λž˜μŠ€μ— μ˜€λ²„λ‘œλ”© 된 λ‹€λ₯Έ 생성차λ₯Ό ν˜ΈμΆœν•  λ•Œ this ν‚€μ›Œλ“œκ°€ μ‚¬μš©λœλ‹€.

μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  λ•Œμ—λŠ” μ›ν•˜λŠ” μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό ν™•μΈν•œ ν›„ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 것 처럼
this(λ§€κ°œλ³€μˆ˜...)의 ν˜•νƒœλ‘œ μ΄μš©ν•˜λ©΄ λœλ‹€.

 

μœ„μ—μ„  2개의 λ§€κ°œλ³€μˆ˜λ₯Ό μž…λ ₯받은 μƒμ„±μž(name, color)의 κ΅¬ν˜„λΆ€λΆ„μ—μ„œ
4개의 λ§€κ°œλ³€μˆ˜λ₯Ό μƒμ„±μž(name, color, weight, count)λ₯Ό ν˜ΈμΆœν•˜κ³  μžˆλ‹€.

3. 객체 μžμ‹ μ˜ 참쑰값을 μ „λ‹¬ν•˜κ³  싢을 λ•Œ

public class Fruit {
    public String name;
    public String color;
    public double weight;
    public int count;

    public Fruit(String name, String color, double weight, int count) {
        this.name = name;
        this.color = color;
        this.weight = weight;
        this.count = count;
    }

    public Fruit getFruitInstance() {
        return this;
    }
}

μ–΄λ–€ λ©”μ†Œλ“œμ—μ„œλŠ” λ™μž‘μ„ μ™„λ£Œν•˜κ³  λ¦¬ν„΄κ°’μœΌλ‘œ
λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‘œ 객체, 자기 μžμ‹ μ˜ 참쑰값을 μ „λ‹¬ν•˜κ³  μ‹Άμ–΄ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€.

이럴 λ•Œ getFruitInstance() 처럼 this ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•¨μœΌλ‘œμ¨ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

 

더보기

https://library1008.tistory.com/4

Java의 정석 (λ„μš°μΆœνŒ, 남ꢁ성 μ €)

Seize the day!

Spring MVC | Spring Boot | Spring Security | Mysql | Oracle | PostgreSQL | Vue.js | Nuxt.js | React.js | TypeScript | JSP | Frontend | Backend | Full Stack | μžκΈ°κ³„λ°œ | 미라클 λͺ¨λ‹ | 일상