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

๐Ÿ‘ถ ์ƒ์†

๊ธฐ์กด์˜ ํด๋ž˜์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ

์žฅ์  ๋ฐ ํŠน์ง•

  • ์ ์€ ์–‘์˜ ์ฝ”๋“œ๋กœ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค ์ž‘์„ฑ ๊ฐ€๋Šฅ
  • ์ฝ”๋“œ๋ฅผ ๊ณตํ†ต์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด ์ฝ”๋“œ์˜ ์ถ”๊ฐ€/๋ณ€๊ฒฝ์ด ์šฉ์ด
  • ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ  ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒ์‚ฐ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์— ํฌ๊ฒŒ ๊ธฐ์—ฌ

์ƒ์†๋ฐฉ๋ฒ•

[์ƒˆ๋กœ ์ž‘์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ํด๋ž˜์Šค] extends [์ƒ์† ๋ฐ›๊ณ ์žํ•˜๋Š” ํด๋ž˜์Šค]
[์ž์‹ ํด๋ž˜์Šค] extends [์กฐ์ƒ ํด๋ž˜์Šค]
[ํ•˜์œ„ ํด๋ž˜์Šค] extends [์ƒ์œ„ ํด๋ž˜์Šค]
[ํŒŒ์ƒ๋œ ํด๋ž˜์Šค] extends [๊ธฐ๋ฐ˜ ํด๋ž˜์Šค]
Child extends Parent

๐Ÿ“ข ๋‹จ์ผ ์ƒ์†
JAVA๋Š” ๋‹ค์ค‘ ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅ ํ•˜๋‹ค. ๋‹จ์ผ ์ƒ์†๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
โŒ: (์ž์†) extends (์กฐ์ƒ1), (์กฐ์ƒ2)

์ƒ์† ๊ณ„์ธต๋„

์ƒ์† ๊ณ„์ธต๋„

๋‹ค์ด์–ด๊ทธ๋žจ

๋‹ค์ด์–ด๊ทธ๋žจ

๐Ÿšจ ์กฐ์ƒํด๋ž˜์Šค๊ฐ€ ๋ฉด๊ฒฝ๋˜๋ฉด ์ž์†ํด๋ž˜์Šค๋Š” ์ž๋™์ ์œผ๋กœ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค
๐Ÿšจ ์ž์†ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์€ ์กฐ์ƒ ํด๋ž˜์Šค์— ์˜ํ–ฅ ์—†๋‹ค
๐Ÿšจ ์ƒ์„ฑ์ž์™€ ์ดˆ๊ธฐํ™” ๋ธ”๋Ÿญ์€ ์ƒ์†๋˜์ง€ ์•Š๋Š”๋‹ค
๐Ÿšจ ์ž์† ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๊ฐœ์ˆ˜๋Š” ์กฐ์ƒ ํด๋ž˜์Šค๋ณด๋‹ค ํ•ญ์ƒ ๊ฐ™๊ฑฐ๋‚˜ ๋งŽ๋‹ค (๊ทธ๋ž˜์„œ extends : ํ™•์žฅ์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์”€)

์˜ˆ์ œ

package com.week.six;

class Tv {
    boolean power; 
    int channel;

    void power() {
        power = !power;
    }

    void channelUp() {
        ++channel;
    }

    void channelDown() {
        --channel;
    }
}

class CaptionTv extends Tv {
    boolean caption;
    void displayCaption() {
        if (caption) {
            System.out.println("Hello, World");
        }
    }
}

class CaptionTvTest {
    public static void main(String[] args) {
        CaptionTv ctv = new CaptionTv();
        ctv.channel = 10;
        ctv.channelUp();
        System.out.println(ctv.channel);
        ctv.displayCaption();
        ctv.caption = true;
        ctv.displayCaption();
    }
}

์ž์† ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„์™€ ์ž์† ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๊ฐ€ ํ•ฉ์ณ์ง„ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋กœ ์ƒ์„ฑ๋œ๋‹ค.

ํฌํ•จ ๊ด€๊ณ„

์ƒ์† ์™ธ์— ํด๋ž˜์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•.
ํ•œ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ.

class Circle {
    Point c = new Point();
    int r;
}

์ƒ์†/ํฌํ•จ ๊ด€๊ณ„๋Š” ์–ด๋–ป๊ฒŒ ๊ฒฐ์ • ์ง“๋Š”๊ฐ€?

๐Ÿšจ ์ƒ์†: (์ž์‹)์€ (์กฐ์ƒ)์ด๋‹ค.
๐Ÿšจ ํฌํ•จ๊ด€๊ณ„ : (์ž์‹)์€ (์กฐ์ƒ)์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์œ„ ๋ฌธ์žฅ์— ๋Œ€์ž…ํ•ด๋ณด๊ณ  ์ ์ ˆํ•œ ๊ฒƒ์„ ์„ ํƒํ•˜๋ฉด ๋œ๋‹ค.
ex)
โญ• : '์›'์€ '๋„ํ˜•'์ด๋‹ค. '์›'์€ '์ '์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
โŒ : '์›'์€ '์ '์ด๋‹ค. '์›'์€ '๋„ํ˜•'์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๐Ÿ‘ถ super

super ์™€ super()๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
๋จผ์ € super๋Š” ์ž์† ํด๋ž˜์Šค์—์„œ ์กฐ์ƒ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ ๋ฉค๋ฒ„๋ฅผ ์ฐธ์กฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ฐธ์กฐ๋ณ€์ˆ˜์ด๋‹ค.
๋ฉค๋ฒ„๋ณ€์ˆ˜์™€ ์ง€์—ญ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ด ๊ฐ™์„ ๋•Œ this๋ฅผ ๋ถ™์—ฌ์„œ ๊ตฌ๋ณ„ํ–ˆ๋“ฏ์ด ์ƒ์†๋ฐ›์€ ๋ฉค๋ฒ„์™€ ์ž์‹ ์˜ ๋ฉค๋ฒ„์™€ ์ด๋ฆ„์ด ๊ฐ™์„ ๋•Œ ์“ด๋‹ค.

class SuperTest {
    public static void main(String args[]) {
        Child c = new Child();
        c.method();
    }
}

class Parent {
    int x = 10;
}
class Child extends Parent {
    void method() {
        System.out.println("x=" + x);
        System.out.println("this.x=" + this.x); // Child์˜ x
        System.out.println("super.x=" + super.x); // Parent์˜ x
    }
}

๋ณ€์ˆ˜ ๋งŒ์ด ์•„๋‹ˆ๋ผ ๋ฉ”์„œ๋“œ ์—ญ์‹œ super๋ฅผ ์จ์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์† ํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•œ ๊ฒฝ์šฐ์— super๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

class Point {    
    int x;
    int y;

    String getLocation() {
        int x;
        String getLocation() { // ์˜ค๋ฒ„๋ผ์ด๋”ฉ
            // return "x: " + x + ", y : " + y + ", z : " + z; 
            return super.getLocation() + ", z :" + z; // ์กฐ์ƒ์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
    }
}

super()

this() ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ super() ์—ญ์‹œ ์ƒ์„ฑ์ž์ด๋‹ค.
this()๋Š” ํด๋ž˜์Šค์˜ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์ง€๋งŒ
super()๋Š” ์กฐ์ƒ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

 

์กฐ์ƒํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•˜๋Š” ์ด์œ ๋Š” ์ž์† ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๊ฐ€ ์กฐ์ƒํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ์กฐ์ƒ์˜ ๋ฉค๋ฒ„๋“ค์ด ๋จผ์ € ์ดˆ๊ธฐํ™”๋˜์–ด ์žˆ์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋•Œ๋ฌธ์— ๋ฌด์กฐ๊ฑด Object ํด๋ž˜์Šค๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋Š” ์ฒซ ์ค„์— ๋ฐ˜๋“œ์‹œ ์ž์‹ ์˜ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž ๋˜๋Š” ์กฐ์ƒ์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•œ๋‹ค.
(๋„ฃ์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ด๋‹ค.)

class PointTest {    
    public static void mian(String args[]) {    
        Point 3D p3 = new Point3D(1, 2, 3);
    }
}

class Point {
    int x, y;

    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    String getLocation() {
        return "x :" + x + ", y : " + y;
    }

    class Point3D extends Point {
        int z;

        Point3D(int x, int y, int z) {
        // ์ƒ์„ฑ์ž ์ฒซ ์ค„์—์„œ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด ๋ถ€๋ถ„์— super();๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.
        // super()๋Š” Point3D์˜ ์กฐ์ƒ์ธ Pointํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์ธ Point()๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
            this.x = x;
            this.y = y;
            this.z = z;
        }

        String getLocation() { // ์˜ค๋ฒ„๋ผ์ด๋”ฉ
            retrun "x: " + x + ", y : " +  y + ", z : " + z;
        }
    }

๐Ÿšจ ์ƒ์„ฑ์ž๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š” ํด๋ž˜์Šค์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
๋•Œ๋ฌธ์— ์œ„ ์ฝ”๋“œ๋Š” Point()๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— super()๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„  super()๊ฐ€ Point(int x, int y) ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก super(x, y); ๋กœ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.

๐Ÿ‘ถ ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ

์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด๋ž€?

์กฐ์ƒ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ.
Overied์˜ ์‚ฌ์ „์ ์ธ ์˜๋ฏธ๋Š” ์œ„์— ๋ฎ์–ด์“ฐ๋‹ค(OverWrite) ์ด๋‹ค.

class SuperTest2 {

}

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

โœ ์ด๋ฆ„์ด ๊ฐ™์•„์•ผํ•œ๋‹ค.
โœ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์•„์•ผํ•œ๋‹ค.
โœ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๊ฐ™์•„์•ผํ•œ๋‹ค.
โœ ์ ‘๊ทผ ์ œ์–ด์ž๋Š” ์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ์ข์€ ๋ฒ”์œ„๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
public > protecte > default > private
โœ ์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ๋ณด๋‹ค ๋งŽ์€ ์ˆ˜์˜ ์˜ˆ์™ธ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค.
์กฐ์ƒํด๋ž˜์Šค์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ์ ์€ ๊ฐœ์ˆ˜์˜ ์˜ˆ์™ธ๋ฅผ ์„ ์–ธํ•ด๋„ Exception ๊ฐ™์€ ๋ชจ๋“  ์˜ˆ์™ธ์˜ ์ตœ๊ณ  ์กฐ์ƒ์„ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†๋‹ค. ์กฐ์ƒ๋ณด๋‹ค ๋ฒ”์œ„๊ฐ€ ์ข์•„์•ผํ•œ๋‹ค.
โœ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ static ๋ฉ”์„œ๋“œ๋กœ ๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

์˜ค๋ฒ„๋กœ๋”ฉ์ด๋ž€?

๊ธฐ์กด์— ์—†๋Š” ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์˜ค๋ฒ„๋กœ๋”ฉ์€ ๋„ˆ๋ฌด ๋งŽ์ด ์ ์žฌํ–ˆ๋‹ค(Overload) ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ์— ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…, ๊ฐœ์ˆ˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•œ ๊ฒƒ์„ ๋งํ•œ๋‹ค.

class Parent {
    void parentMethod() {}
}

class Child extends Parent {
    void parentMethod() {} // ์˜ค๋ฒ„ ๋ผ์ด๋”ฉ
    void parentMethod(int i) {} // ์˜ค๋ฒ„๋กœ๋”ฉ

    void childMethod() {}
    void childMethod(int i) {} // ์˜ค๋ฒ„๋กœ๋”ฉ
    void childMethod() {}
}

๐Ÿ‘ถ ๋‹ค์ด๋‚˜๋ฏน ๋ฉ”์†Œ๋“œ ๋””์ŠคํŒจ์น˜

๋Ÿฐํƒ€์ž„์— ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ๋‹คํ˜•์„ฑ์„ ๋งŒ์กฑํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

public class Animal {
  public void move() {
    System.out.println("Animals can move");
  }
}

public class Dog extends Animal {
  @Override
  public void move() {
    System.out.println("Dogs can walk and run");
  }
}

public class Main {

  public static void main(String[] args) {
    Animal a = new Animal(); // Animal ์ฐธ์กฐ, Animal ๊ฐ์ฒด
    Animal b = new Dog(); // Animal ์ฐธ์กฐ, Dog ๊ฐ์ฒด

    a.move(); // Animal ํด๋ž˜์Šค์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ ์‹คํ–‰
    b.move(); // Dog ํด๋ž˜์Šค์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋จ(๋‹ค์ด๋‚˜๋ฏน ๋ฉ”์†Œ๋“œ ๋””์ŠคํŒจ์น˜)
  }
}

๐Ÿ‘ถ ์ถ”์ƒ ํด๋ž˜์Šค

์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งํ•œ๋‹ค.


์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ผ๋ฐ˜ํด๋ž˜์Šค์™€ ์ „ํ˜€ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค.
์ถ”์ƒ ํด๋ž˜์Šค์—๋„ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๊ณ , ๋ฉค๋ฒ„๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ๋„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

ํด๋ž˜์Šค์— abstract ํ‚ค์›Œ๋“œ๋งŒ ๋ถ™์—ฌ์ฃผ๋ฉด ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ๋œ๋‹ค.

abstract class ํด๋ž˜์Šค ์ด๋ฆ„ {
    ...
}

์ถ”์ƒ ๋ฉ”์„œ๋“œ

๊ธฐ๋ณธ์ ์ธ ๋ฉ”์„œ๋“œ๋Š” ์„ ์–ธ๋ถ€์™€ ๊ตฌํ˜„๋ถ€(์ค‘๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ์ง„ ๋ถ€๋ถ„)๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋Š”๋ฐ
์ถ”์ƒ ๋ฉ”์„œ๋“œ๋Š” ๊ตฌํ˜„๋ถ€๋Š” ์—†๊ณ  ์„ ์–ธ๋ถ€๋งŒ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
๋ง ๊ทธ๋Œ€๋กœ ์ •ํ™•ํ•œ ๋‚ด์šฉ์„ ์•Œ ์ˆ˜ ์—†์œผ๋‹ˆ "์ถ”์ƒ์ "์ธ ๋ฉ”์†Œ๋“œ์ธ ๊ฒƒ์ด๋‹ค.

 

์ถ”์ƒ ๋ฉ”์„œ๋“œ๋„ abstract ํ‚ค์›Œ๋“œ๋งŒ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

abstract ๋ฆฌํ„ดํƒ€์ž… ๋ฉ”์„œ๋“œ ์ด๋ฆ„();

์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

๋ฉ”์„œ๋“œ์˜ ๋‚ด์šฉ์ด ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์กฐ์ƒํด๋ž˜์Šค์—์„œ๋Š” ์„ ์–ธ๋ถ€๋งŒ ์ž‘์„ฑํ•˜๊ณ ,
์‹ค์ œ ๋‚ด์šฉ์€ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•˜๋„๋ก ๋น„์›Œ๋‘๋Š” ๊ฒƒ์ด๋‹ค.

abstract class Player { // ์ถ”์ƒํด๋ž˜์Šค
    abstract void play(int pos); // ์ถ”์ƒ๋ฉ”์„œ๋“œ
    abstract void stop(); // ์ถ”์ƒ๋ฉ”์„œ๋“œ
}

class AudioPlayer extends Play {
    void play(int pos) { ... } // ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„(์˜ค๋ฒ„๋ผ์ด๋”ฉ)
    void stop() { ... } // ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„(์˜ค๋ฒ„๋ผ์ด๋”ฉ)
}

abstract class AbstractPlayer etends Player {
    void play(int pos) { ... } // ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„
}

์ถ”์ƒํ™” : ํด๋ž˜์Šค ๊ฐ„์˜ ๊ณตํ†ต์ ์„ ์ฐพ์•„๋‚ด์„œ ๊ณตํ†ต์˜ ์กฐ์ƒ์„ ๋งŒ๋“œ๋Š” ์ž‘์—…
๊ตฌ์ฒดํ™” : ์ƒ์†์„ ํ†ตํ•ด ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„, ํ™•์žฅํ•˜๋Š” ์ž‘์—…

๐Ÿ‘ถ ์ œ์–ด์ž

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

์ ‘๊ทผ์ œ์–ด์ž : public, protected, d efault, private
๊ทธ ์™ธ : static final, abstract, native, transient, synchronized, volatile, strictfp

static

"ํด๋ž˜์Šค์˜" ๋˜๋Š” "๊ณตํ†ต์ ์ธ"์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋˜์—ˆ๋”๋ผ๋„ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๊ฐ’์„ ์œ ์ง€ํ•˜์ง€๋งŒ,

ํด๋ž˜์Šค ๋ณ€์ˆ˜๋Š” ์ธ์Šคํ„ด์Šค ์ƒ๊ด€์—†์ด ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์™€ static๋ฉ”์„œ๋“œ(ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ)์˜ ์ฐจ์ด๋Š”

๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€์˜ ์—ฌ๋ถ€์— ์žˆ๋‹ค.

static์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ณณ - ๋ฉค๋ฒ„๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ, ์ดˆ๊ธฐํ™” ๋ธ”๋Ÿญ

์ œ์–ด์ž ๋Œ€์ƒ ์˜๋ฏธ
static ๋ฉค๋ฒ„๋ณ€์ˆ˜ - ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค ๋ณ€์ˆ˜๊ฐ€ ๋œ๋‹ค.
- ํด๋ž˜์Šค ๋ณ€์ˆ˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
- ํด๋ž˜์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
๋ฉ”์„œ๋“œ - ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•œ static ๋ฉ”์„œ๋“œ๊ฐ€ ๋œ๋‹ค.
- static ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ๋Š” ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„๋“ค์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
class Static Test {
    static int width = 200; // ํด๋ž˜์Šค ๋ณ€์ˆ˜(static ๋ณ€์ˆ˜)
    static int height = 120; // ํด๋ž˜์Šค ๋ณ€์ˆ˜(static ๋ณ€์ˆ˜

    static { 
        // static ๋ณ€์ˆ˜์˜ ๋ณต์žกํ•œ ์ดˆ๊ธฐํ™” ์ˆ˜ํ–‰
    }

    static int max(int a, int b) { // ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ(static ๋ฉ”์„œ๋“œ)
        return a > b ? a : b;
    }
}

final

final์€ '๋งˆ์ง€๋ง‰์˜' ๋˜๋Š” '๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋Š”'์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋ณ€์ˆ˜์— ์‚ฌ์šฉ๋˜๋ฉด ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ƒ์ˆ˜๊ฐ€ ๋˜๊ณ ,

๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉ๋˜๋ฉด ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ•  ์ˆ˜ ์—†๊ณ ,

ํด๋ž˜์Šค์— ์‚ฌ์šฉ๋˜๋ฉด ์ž์‹ ์„ ํ™•์žฅํ•˜๋Š” ์ž์† ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค.

final์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ณณ - ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ๋ฉค๋ฒ„๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜

์ œ์–ด์ž ๋Œ€์ƒ ์˜๋ฏธ
final ํด๋ž˜์Šค ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค, ํ™•์žฅ๋  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ final๋กœ ์ง€์ •๋œ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์กฐ์ƒ์ด ๋  ์ˆ˜ ์—†๋‹ค.
๋ฉ”์„œ๋“œ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋Š” ๋ฉ”์„œ๋“œ, final๋กœ ์ง€์ •๋œ ๋ฉ”์„œ๋“œ๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ†ตํ•ด ์žฌ์ •์˜๋  ์ˆ˜ ์—†๋‹ค.
๋ฉค๋ฒ„๋ณ€์ˆ˜ ๋ณ€์ˆ˜ ์•ž์— final์ด ๋ถ™์œผ๋ฉด ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ƒ์ˆ˜๊ฐ€ ๋œ๋‹ค.
์ง€์—ญ ๋ณ€์ˆ˜
final class FinalTest { // ์กฐ์ƒ์ด ๋  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค
    final int MAX_SIZE = 10; // ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜(์ƒ์ˆ˜)

    final void getMaxSize() { // ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ์ˆ˜ ์—†๋Š” ๋ฉ”์„œ๋“œ(๋ณ€๊ฒฝ ๋ถˆ๊ฐ€)
        final int LV = MAX_SIZE; // ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ง€์—ญ๋ณ€์ˆ˜(์ƒ์ˆ˜)
        return MAX_SIZE;
    }
}

์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•œ final ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™”

final์ด ๋ถ™์€ ๋ณ€์ˆ˜๋Š” ์ƒ์ˆ˜์ด๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ๋™์‹œ์— ํ•˜์ง€๋งŒ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ์ƒ์„ฑ์ž์—์„œ ์ดˆ๊ธฐํ™”๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํด๋ž˜์Šค ๋‚ด์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š” ์ƒ์„ฑ์ž๋ฅผ ์„ ์–ธํ•˜์—ฌ, ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ final์ด ๋ถ™์€ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๊ฐ’์„ ์ƒ์„ฑ์ž์˜ ๋งค๊ฐœ๋ฒผ์ˆ˜๋กœ๋ถ€ํ„ฐ ์ œ๊ณต๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค final์ด ๋ถ™์€ ๋ฉค๋ฒ„๋ณ€์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ–๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

class Card {
    final int NUMBER; // ์ƒ์ˆ˜์ง€๋งŒ ์„ ์–ธ๊ณผ ํ•จ๊ป˜ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ 
    final String KIND; // ์ƒ์„ฑ์ž์—์„œ ๋‹จ ํ•œ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
    static int width = 100;
    static int height = 250;

    Card (String kind, int num) { // ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ฒจ๋ฐ›์€ ๊ฐ’์œผ๋กœ KIND์™€ NUMBER๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
        KINE = kind; 
        NUMBER = num;
    }

    Card() {
        this("HEART", 1);
    }

    public String toString() {
        return KIND + " " + NUMBER;
    }

    class FinalCardTest {
        public static void main(String args[]) {    
            Card c = new Card(HEART", 10);
            // c.NUMBER = 5 < ์—๋Ÿฌ ๋ฐœ์ƒ
            System.out.pringln(c.KIND); // HEART
            System.out.pringln(c.NUMBer); // 10
            System.out.pringln(c) // HEART 10
        }
    }
}

abstract

abstract๋Š” ๋ฏธ์™„์„ฑ์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

absract๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ณณ - ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ

์ œ์–ด์ž ๋Œ€์ƒ ์˜๋ฏธ
abstract ํด๋ž˜์Šค ํด๋ž˜์Šค ๋‚ด์— ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.
๋ฉ”์„œ๋“œ ์„ ์–ธ๋ถ€๋งŒ ์ž‘์„ฑํ•˜๊ณ  ๊ตฌํ˜„๋ถ€๋Š” ์ž‘์„ฑํ•˜์ง€ ์•Š์€ ์ถ”์ƒ ๋ฉ”์„œ๋“œ์ž„์„ ์•Œ๋ฆฐ๋‹ค.

์ ‘๊ทผ ์ œ์–ด์ž

์ ‘๊ทผ ์ œ์–ด์ž๋Š” ๋ฉค๋ฒ„ ๋˜๋Š” ํด๋ž˜์Šค์— ์‚ฌ์šฉ๋˜์–ด ํ•ด๋‹นํ•˜๋Š” ๋ฉค๋ฒ„ ๋˜๋Š” ํด๋ž˜์Šค๋ฅผ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ œํ•œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ ‘๊ทผ ์ œ์–ด์ž๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ณณ - ํด๋ž˜์Šค, ๋ฉค๋ฒ„๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž
private - ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
default - ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
protected - ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์—์„œ, ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์˜ ์ž์†ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
public - ์ ‘๊ทผ ์ œํ•œ์ด ์ „ํ˜€ ์—†๋‹ค.

์ œ์–ด์ž ๊ฐ™์€ ํด๋ž˜์Šค ๊ฐ™์€ ํŒจํ‚ค์ง€ ์ž์† ํด๋ž˜์Šค ์ „์ฒด
public โญ• โญ• โญ• โญ•
protected โญ• โญ• โญ•  
(default) โญ• โญ•    
private โญ•      

public > protected > (default) > private

๐Ÿ‘ถ Object ํด๋ž˜์Šค

๋ชจ๋“  ํด๋ž˜์Šค ์ƒ์† ๊ณ„์ธต๋„์˜ ์ตœ์ƒ์œ„์— ์žˆ๋Š” ์กฐ์ƒ ํด๋ž˜์Šค.

ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ extends Object๋ฅผ ๋ถ™์ธ๋‹ค.
toString(), equals(Object o) ๋“ฑ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ€์ ธ์•ผํ•  ๊ธฐ๋ณธ์ ์ธ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ทธ๋ƒฅ ์“ธ ์ˆ˜ ์žˆ๋Š” ์ด์œ ์ด๋‹ค.

Seize the day!

Spring MVC | Spring Boot | Spring Security | Mysql | Oracle | PostgreSQL | Vue.js | Nuxt.js | React.js | TypeScript | JSP | Frontend | Backend | Full Stack | ์ž๊ธฐ๊ณ„๋ฐœ | ๋ฏธ๋ผํด ๋ชจ๋‹ | ์ผ์ƒ