๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Today I Learned(TIL)/Java

Java ๊ธฐ๋ณธํŽธ ๊ฐ•์˜_์ƒ์†

by carrot0911 2024. 12. 1.

์ƒ์†

 

์ƒ์† - ์‹œ์ž‘

package extends1.ex1;

public class ElectricCar {

    public void move() {
        System.out.println("์ฐจ๋ฅผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.");
    }

    public void charge() {
        System.out.println("์ถฉ์ „ํ•ฉ๋‹ˆ๋‹ค.");
    }
}
package extends1.ex1;

public class GasCar {

    public void move() {
        System.out.println("์ฐจ๋ฅผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.");
    }

    public void fillUp() {
        System.out.println("๊ธฐ๋ฆ„์„ ์ฃผ์œ ํ•ฉ๋‹ˆ๋‹ค.");
    }
}
package extends1.ex1;

public class CarMain {

    public static void main(String[] args) {
        ElectricCar electricCar = new ElectricCar();
        electricCar.move();
        electricCar.charge();

        GasCar gasCar = new GasCar();
        gasCar.move();
        gasCar.fillUp();
    }
}

์ „๊ธฐ์ฐจ๋“  ๊ฐ€์†”๋ฆฐ์ฐจ๋“  ์ฃผ์œ ํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅธ ๊ฒƒ์ด์ง€ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ ๋˜‘๊ฐ™๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ์ƒ์† ๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ด๋‹ค.

 

์ƒ์† ๊ด€๊ณ„

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

์šฉ์–ด ์ •๋ฆฌ

  • ๋ถ€๋ชจ ํด๋ž˜์Šค (์Šˆํผ ํด๋ž˜์Šค) : ์ƒ์†์„ ํ†ตํ•ด ์ž์‹ ์˜ ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.
  • ์ž์‹ ํด๋ž˜์Šค (์„œ๋ธŒ ํด๋ž˜์Šค) : ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค์ด๋‹ค.

๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ex2 ํŒจํ‚ค์ง€๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ ๋‹ค.

package extends1.ex2;

public class Car {
    
    public void move() {
        System.out.println("์ฐจ๋ฅผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.");
    }
}
package extends1.ex2;

public class ElectricCar extends Car{

    public void charge() {
        System.out.println("์ถฉ์ „ํ•ฉ๋‹ˆ๋‹ค.");
    }
}
package extends1.ex2;

public class GasCar extends Car{

    public void fillUp() {
        System.out.println("๊ธฐ๋ฆ„์„ ์ฃผ์œ ํ•ฉ๋‹ˆ๋‹ค.");
    }
}
package extends1.ex2;

public class CarMain {
    public static void main(String[] args) {
        ElectricCar electricCar = new ElectricCar();
        electricCar.move();
        electricCar.charge();

        GasCar gasCar = new GasCar();
        gasCar.move();
        gasCar.fillUp();
    }
}

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

๋‹จ์ผ ์ƒ์†

์ฐธ๊ณ ๋กœ ์ž๋ฐ”๋Š” ๋‹ค์ค‘ ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ extends ๋Œ€์ƒ์€ ํ•˜๋‚˜๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ถ€๋ชจ๋ฅผ ํ•˜๋‚˜๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.
๋ฌผ๋ก  ๋ถ€๋ชจ๊ฐ€ ๋˜ ๋‹ค๋ฅธ ๋ถ€๋ชจ๋ฅผ ํ•˜๋‚˜ ๊ฐ€์ง€๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ๋‹ค.

๋‹ค์ค‘ ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ๋งค์šฐ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ์  ๋•Œ๋ฌธ์— Java๋Š” ํด๋ž˜์Šค์˜ ๋‹ค์ค‘ ์ƒ์†์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

์ƒ์†๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

์ด ๋ถ€๋ถ„์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์•ž์œผ๋กœ ์ •๋ง ์ค‘์š”ํ•˜๋‹ค!

ElectricCar electricCar = new ElectricCar();

new ElectricCar( )๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ElectricCar ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ƒ์† ๊ด€๊ณ„์— ์žˆ๋Š” Car๊นŒ์ง€ ํ•จ๊ป˜ ํฌํ•จํ•ด์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
์ฐธ์กฐ๊ฐ’์€ x001๋กœ ํ•˜๋‚˜์ด์ง€๋งŒ ์‹ค์ œ๋กœ ๊ทธ ์•ˆ์—์„œ๋Š” Car, ElectircCar๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ํด๋ž˜์Šค ์ •๋ณด๊ฐ€ ๊ณต์กดํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ƒ์†์ด๋ผ๊ณ  ํ•ด์„œ ๋‹จ์ˆœํ•˜๊ฒŒ ๋ถ€๋ชจ์˜ ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ๋งŒ ๋ฌผ๋ ค๋ฐ›๋Š” ๊ฒŒ ์•„๋‹ˆ๋‹ค. ์ƒ์† ๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ชจ ํด๋ž˜์Šค๋„ ํ•จ๊ป˜ ํฌํ•จํ•ด์„œ ์ƒ์„ฑ๋œ๋‹ค.
์™ธ๋ถ€์—์„œ ๋ณผ ๋•Œ๋Š” ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋‚ด๋ถ€์—์„œ๋Š” ๋ถ€๋ชจ์™€ ์ž์‹์ด ๋ชจ๋‘ ์ƒ์„ฑ๋˜๊ณ  ๊ณต๊ฐ„๋„ ๊ตฌ๋ถ„๋œ๋‹ค.

electricCar.charge( ) ํ˜ธ์ถœ

electricCar.charge( )๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ฐธ์กฐ๊ฐ’์„ ํ™•์ธํ•ด์„œ x001.charge( )๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๋”ฐ๋ผ์„œ x001์„ ์ฐพ์•„์„œ charge( )๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ƒ์† ๊ด€๊ณ„์˜ ๊ฒฝ์šฐ์—๋Š” ๋‚ด๋ถ€์— ๋ถ€๋ชจ์™€ ์ž์‹์ด ๋ชจ๋‘ ์กด์žฌํ•œ๋‹ค. ์ด๋•Œ ๋ถ€๋ชจ์ธ Car๋ฅผ ํ†ตํ•ด์„œ charge( )๋ฅผ ์ฐพ์„์ง€ ์•„๋‹ˆ๋ฉด ElectricCar๋ฅผ ํ†ตํ•ด์„œ charge( )๋ฅผ ์ฐพ์„์ง€ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.
์ด๋•Œ๋Š” ํ˜ธ์ถœํ•˜๋Š” ๋ณ€์ˆ˜์˜ ํƒ€์ž…(ํด๋ž˜์Šค)์„ ๊ธฐ์ค€์œผ๋กœ ์„ ํƒํ•œ๋‹ค. electricCar ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ElectricCar์ด๋ฏ€๋กœ ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์— ๊ฐ™์€ ํƒ€์ž…์ธ ElectricCar๋ฅผ ํ†ตํ•ด์„œ charge( )๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

electricCar.move( ) ํ˜ธ์ถœ

electricCar.move( )๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋จผ์ € x001 ์ฐธ์กฐ๋กœ ์ด๋™ํ•œ๋‹ค. ๋‚ด๋ถ€์—๋Š” Car, ElectricCar ๋‘ ๊ฐ€์ง€ ํƒ€์ž…์ด ์žˆ๋‹ค. ์ด๋•Œ ํ˜ธ์ถœํ•˜๋Š” ๋ณ€์ˆ˜์ธ electricCar์˜ ํƒ€์ž…์ด ElectricCar์ด๋ฏ€๋กœ ์ด ํƒ€์ž…์„ ์„ ํƒํ•œ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ElectricCar์—๋Š” move( ) ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋‹ค. ์ƒ์† ๊ด€๊ณ„์—์„œ๋Š” ์ž์‹ ํƒ€์ž…์— ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฉด ๋ถ€๋ชจ ํƒ€์ž…์œผ๋กœ ์˜ฌ๋ผ๊ฐ€์„œ ์ฐพ๋Š”๋‹ค. ์ด ๊ฒฝ์šฐ ElectricCar์˜ ๋ถ€๋ชจ๋‹˜ Car๋กœ ์˜ฌ๋ผ๊ฐ€์„œ move( )๋ฅผ ์ฐพ๋Š”๋‹ค. ๋ถ€๋ชจ์ธ Car์— move( )๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋ถ€๋ชจ์— ์žˆ๋Š” move( ) ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

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

์ง€๊ธˆ๊นŒ์ง€ ์„ค๋ช…ํ•œ ์ƒ์†๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋Š” ๋ฐ˜๋“œ์‹œ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค!

  • ์ƒ์† ๊ด€๊ณ„์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ๊ทธ ๋‚ด๋ถ€์—๋Š” ๋ถ€๋ชจ์™€ ์ž์‹์ด ๋ชจ๋‘ ์ƒ์„ฑ๋œ๋‹ค.
  • ์ƒ์† ๊ด€๊ณ„์˜ ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ๋Œ€์ƒ ํƒ€์ž…์„ ์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ ํ˜ธ์ถœ์ž์˜ ํƒ€์ž…์„ ํ†ตํ•ด ๋Œ€์ƒ ํƒ€์ž…์„ ์ฐพ๋Š”๋‹ค.
  • ํ˜„์žฌ ํƒ€์ž…์—์„œ ๊ธฐ๋Šฅ์„ ์ฐจ์ง€ ๋ชปํ•˜๋ฉด ์ƒ์œ„ ๋ถ€๋ชจ ํƒ€์ž…์œผ๋กœ ๊ธฐ๋Šฅ์„ ์ฐพ์•„์„œ ์‹คํ–‰ํ•œ๋‹ค. ๊ธฐ๋Šฅ์„ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

์ƒ์†๊ณผ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ex3 ํŒจํ‚ค์ง€๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ๋‹ค.

package extends1.ex3;

public class Car {
    
    public void move() {
        System.out.println("์ฐจ๋ฅผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.");
    }
    
    // ์ถ”๊ฐ€
    public void openDoor() {
        System.out.println("๋ฌธ์„ ์—ฝ๋‹ˆ๋‹ค.");
    }
}
package extends1.ex3;

public class ElectricCar extends Car {

    public void charge() {
        System.out.println("์ถฉ์ „ํ•ฉ๋‹ˆ๋‹ค.");
    }
}
package extends1.ex3;

public class GasCar extends Car {

    public void fillUp() {
        System.out.println("๊ธฐ๋ฆ„์„ ์ฃผ์œ ํ•ฉ๋‹ˆ๋‹ค.");
    }
}
package extends1.ex3;

public class HydrogenCar extends Car{

    public void fillHydrogen() {
        System.out.println("์ˆ˜์†Œ๋ฅผ ์ถฉ์ „ํ•ฉ๋‹ˆ๋‹ค.");
    }
}
package extends1.ex3;

public class CarMain {
    public static void main(String[] args) {
        ElectricCar electricCar = new ElectricCar();
        electricCar.move();
        electricCar.charge();
        electricCar.openDoor();

        GasCar gasCar = new GasCar();
        gasCar.move();
        gasCar.fillUp();
        gasCar.openDoor();

        HydrogenCar hydrogenCar = new HydrogenCar();
        hydrogenCar.move();
        hydrogenCar.fillHydrogen();
        hydrogenCar.openDoor();
    }
}

์ƒ์† ๊ด€๊ณ„ ๋•๋ถ„์— ์ค‘๋ณต์€ ์ค„์–ด๋“ค๊ณ , ์ƒˆ๋กœ์šด ์ˆ˜์†Œ์ฐจ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ™•์žฅ(extend)ํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ƒ์†๊ณผ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ

๋ถ€๋ชจ ํƒ€์ž…์˜ ๊ธฐ๋Šฅ์„ ์ž์‹์—์„œ๋Š” ๋‹ค๋ฅด๊ฒŒ ์žฌ์ •์˜ ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ๋‹ค.
์ด๋ ‡๊ฒŒ ๋ถ€๋ชจ์—๊ฒŒ์„œ ์ƒ์†๋ฐ›์€ ๊ธฐ๋Šฅ์„ ์ž์‹์ด ์žฌ์ •์˜ ํ•˜๋Š” ๊ฒƒ์„ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)์ด๋ผ๊ณ  ํ•œ๋‹ค.

@Overriding

package extends1.overriding;

public class ElectricCar extends Car {

    @Override
    public void move() {
        System.out.println("์ „๊ธฐ์ฐจ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.");
    }

    public void charge() {
        System.out.println("์ถฉ์ „ํ•ฉ๋‹ˆ๋‹ค.");
    }
}

@์ด ๋ถ™์€ ๋ถ€๋ถ„์„ ์• ๋…ธํ…Œ์ด์…˜์ด๋ผ๊ณ  ํ•œ๋‹ค. ์• ๋…ธํ…Œ์ด์…˜์„ ์ฃผ์„๊ณผ ๋น„์Šทํ•œ๋ฐ, ํ”„๋กœ๊ทธ๋žจ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํŠน๋ณ„ํ•œ ์ฃผ์„์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
์ด ์• ๋…ธํ…Œ์ด์…˜์€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๋Š” ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ ๋ฉ”์„œ๋“œ ์œ„์— ์ด ์• ๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.
์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด ์• ๋…ธํ…Œ์ด์…˜์„ ๋ณด๊ณ  ๋ฉ”์„œ๋“œ๊ฐ€ ์ •ํ™•ํžˆ ์˜ค๋ฒ„๋ผ์ด๋“œ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์˜ค๋ฒ„๋ผ์ด๋”ฉ ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์ˆ˜๋กœ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•ด ์ค€๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์ด ๊ฒฝ์šฐ์— ๋งŒ์•ฝ ๋ถ€๋ชจ์— move( ) ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค.
์ฐธ๊ณ ๋กœ ์ด ๊ธฐ๋Šฅ์€ ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ฝ”๋“œ์˜ ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ๋ถ™์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์˜ค๋ฒ„๋กœ๋”ฉ(Overloading)๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)

  • ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ : ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๊ฐ™๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading)์ด๋ผ ํ•œ๋‹ค.
    ์˜ค๋ฒ„๋กœ๋”ฉ์€ ๋ฒˆ์—ญํ•˜๋ฉด ๊ณผ์ ์ธ๋ฐ, ๊ณผํ•˜๊ฒŒ ๋ฌผ๊ฑด์„ ๋‹ด์•˜๋‹ค๋Š” ๋œป์ด๋‹ค.
    ๋”ฐ๋ผ์„œ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์ •์˜ํ–ˆ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.
  • ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ : ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒ์† ๊ด€๊ณ„์—์„œ ์‚ฌ์šฉํ•œ๋‹ค. ๋ถ€๋ชจ์˜ ๊ธฐ๋Šฅ์„ ์ž์‹์ด ๋‹ค์‹œ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ๋‹จ์ˆœํžˆ ํ•ด์„ํ•˜๋ฉด ๋ฌด์–ธ๊ฐ€๋ฅผ ๋„˜์–ด์„œ ํƒ€๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ž์‹์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ๋ถ€๋ชจ์˜ ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ๋„˜์–ด ํƒ€์„œ ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์œผ๋กœ ๋ฎ์–ด๋ฒ„๋ฆฐ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.
    ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ์šฐ๋ฆฌ๋ง๋กœ ๋ฒˆ์—ญํ•˜๋ฉด ๋ฌด์–ธ๊ฐ€๋ฅผ ๋‹ค์‹œ ์ •์˜ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์žฌ์ •์˜๋ผ๊ณ  ํ•œ๋‹ค. ์ƒ์† ๊ด€๊ณ„์—์„œ๋Š” ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ์ •์˜ํ•œ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค. ์‹ค๋ฌด์—์„œ๋Š” ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ, ๋ฉ”์„œ๋“œ ์žฌ์ •์˜ ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•œ๋‹ค.

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

  • ๋ฉ”์„œ๋“œ ์ด๋ฆ„ : ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
  • ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜(ํŒŒ๋ผ๋ฏธํ„ฐ) : ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…, ์ˆœ์„œ, ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
  • ๋ฐ˜ํ™˜ ํƒ€์ž… : ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ค. ๋‹จ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ํ•˜์œ„ ํด๋ž˜์Šค ํƒ€์ž…์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ์ ‘๊ทผ ์ œ์–ด์ž : ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋ฉ”์„œ๋“œ์˜ ์ ‘๊ทผ ์ œ์–ด์ž๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ๋” ์ œํ•œ์ ์ด์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๊ฐ€ protected๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฉด ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ด๋ฅผ public ๋˜๋Š” protected๋กœ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, private ๋˜๋Š” default๋กœ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•  ์ˆ˜ ์—†๋‹ค.
  • ์˜ˆ์™ธ : ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋ฉ”์„œ๋“œ๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ๋” ๋งŽ์€ ์ฒดํฌ ์˜ˆ์™ธ๋ฅผ throws๋กœ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ ๋” ์ ๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆ˜์˜ ์˜ˆ์™ธ, ๋˜๋Š” ํ•˜์œ„ ํƒ€์ž…์˜ ์˜ˆ์™ธ๋Š” ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • static, final, private : ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์€ ๋ฉ”์„œ๋“œ๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ์ˆ˜ ์—†๋‹ค.
    • static์€ ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์ธ์Šคํ„ด์Šค ๋ ˆ๋ฒจ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. ์‰ฝ๊ฒŒ ์ด์•ผ๊ธฐํ•ด์„œ ๊ทธ๋ƒฅ ํด๋ž˜์Šค ์ด๋ฆ„์„ ํ†ตํ•ด ํ•„์š”ํ•œ ๊ณณ์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋ฉด ๋œ๋‹ค.
    • final ๋ฉ”์„œ๋“œ๋Š” ์žฌ์ •์˜๋ฅผ ๊ธˆ์ง€ํ•œ๋‹ค.
    • private ๋ฉ”์„œ๋“œ๋Š” ํ•ด๋‹น ํด๋ž˜์Šค์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ƒ์„ฑ์ž ์˜ค๋ฒ„๋ผ์ด๋”ฉ : ์ƒ์„ฑ์ž๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ์ˆ˜ ์—†๋‹ค.

 

์ƒ์†๊ณผ ์ ‘๊ทผ ์ œ์–ด

์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด UML ํ‘œ๊ธฐ๋ฒ•์„ ์ผ๋ถ€ ์‚ฌ์šฉํ–ˆ๋‹ค.

  • + : public
  • # : protected
  • ~ : default
  • - : private
package extends1.access.parent;

public class Parent {

    public int publicValue;
    protected int protectedValue;
    int defaultValue;
    private int privateValue;

    public void publicMethod() {
        System.out.println("Parent.publicMethod");
    }

    protected void protectedMethod() {
        System.out.println("Parent.protectedMethod");
    }

    void defaultMethod() {
        System.out.println("Parent.defaultMethod");
    }

    private void privateMethod() {
        System.out.println("Parent.privateMethod");
    }

    public void printParent() {
        System.out.println("==Parent ๋ฉ”์„œ๋“œ ์•ˆ==");
        System.out.println("publicValue = " + publicValue);
        System.out.println("protectedValue = " + protectedValue);
        System.out.println("defaultValue = " + defaultValue);
        System.out.println("privateValue = " + privateValue);

        // ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ๋ชจ๋‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ
        defaultMethod();
        privateMethod();
    }
}
package extends1.access.child;

import extends1.access.parent.Parent;

public class Child extends Parent {

    public void call() {
        publicValue = 1;
        protectedValue = 1;  // ์ƒ์† ๊ด€๊ณ„ or ๊ฐ™์€ ํŒจํ‚ค์ง€
        //defaultValue = 1;  // ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ์ ‘๊ทผ ๋ถˆ๊ฐ€, ์ปดํŒŒ์ผ ์˜ค๋ฅ˜
        //privateValue = 1;  // ์ ‘๊ทผ ๋ถˆ๊ฐ€, ์ปดํŒŒ์ผ ์˜ค๋ฅ˜

        publicMethod();
        protectedMethod();  // ์ƒ์† ๊ด€๊ณ„ or ๊ฐ™์€ ํŒจํ‚ค์ง€
        //defaultMethod();  // ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ์ ‘๊ทผ ๋ถˆ๊ฐ€, ์ปดํŒŒ์ผ ์˜ค๋ฅ˜
        //privatemethod();  // ์ ‘๊ทผ ๋ถˆ๊ฐ€, ์ปดํŒŒ์ผ ์˜ค๋ฅ˜

        printParent();
    }
}
package extends1.access;

import extends1.access.child.Child;

public class ExtendsAccessMain {

    public static void main(String[] args) {
        Child child = new Child();

        child.call();
    }
}

๋‘˜์˜ ํŒจํ‚ค์ง€๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๋ถ€๋ถ„์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

์ž์‹ํด๋ž˜์Šค์ธ Child์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์ธ Parent์— ์–ผ๋งˆ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  • publicValue = 1 : ๋ถ€๋ชจ์˜ public ํ•„๋“œ์— ์ ‘๊ทผํ•œ๋‹ค. public์ด๋ฏ€๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • protectedValue = 1 : ๋ถ€๋ชจ์˜ protected ํ•„๋“œ์— ์ ‘๊ทผํ•œ๋‹ค. ์ž์‹๊ณผ ๋ถ€๋ชจ๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์ด์ง€๋งŒ, ์ƒ์† ๊ด€๊ณ„์ด๋ฏ€๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • defaultValue = 1 : ๋ถ€๋ชจ์˜ default ํ•„๋“œ์— ์ ‘๊ทผํ•œ๋‹ค. ์ž์‹๊ณผ ๋ถ€๋ชจ๊ฐ€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์ด๋ฏ€๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
  • privateValue = 1 : ๋ถ€๋ชจ์˜ private ํ•„๋“œ์— ์ ‘๊ทผํ•œ๋‹ค. private์€ ๋ชจ๋“  ์™ธ๋ถ€ ์ ‘๊ทผ์„ ๋ง‰์œผ๋ฏ€๋กœ ์ž์‹์ด๋ผ๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

 

super - ๋ถ€๋ชจ ์ฐธ์กฐ

๋ถ€๋ชจ์™€ ์ž์‹์˜ ํ•„๋“œ๋ช…์ด ๊ฐ™๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋˜์–ด ์žˆ์œผ๋ฉด, ์ž์‹์—์„œ ๋ถ€๋ชจ์˜ ํ•„๋“œ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.
์ด๋•Œ super ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ชจ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. super๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๋ถ€๋ชจ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

super - ์ƒ์„ฑ์ž

์ƒ์† ๊ด€๊ณ„์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ฒฐ๊ตญ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด๋ถ€์—๋Š” ์ž์‹๊ณผ ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ๊ฐ๊ฐ ๋‹ค ๋งŒ๋“ค์–ด์ง„๋‹ค.
๋”ฐ๋ผ์„œ ๊ฐ๊ฐ์˜ ์ƒ์„ฑ์ž๋„ ๋ชจ๋‘ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•œ๋‹ค.

์ƒ์† ๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž์‹ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. (๊ทœ์น™)
์ƒ์† ๊ด€๊ณ„์—์„œ ๋ถ€๋ชจ์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” super(. . .)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

  • ์ƒ์† ๊ด€๊ณ„์˜ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์€ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ถ€๋ชจ์—์„œ ์ž์‹ ์ˆœ์„œ๋กœ ์‹คํ–‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ถ€๋ชจ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๊ทธ๋‹ค์Œ์— ์ž์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  • ์ƒ์† ๊ด€๊ณ„์—์„œ ์ž์‹ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ์ฒซ ์ค„์— ๋ฐ˜๋“œ์‹œ super(. . .)๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. ๋‹จ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž(super( ))์ธ ๊ฒฝ์šฐ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ •๋ฆฌ

ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉ๋˜๋Š” final

ํด๋ž˜์Šค์— final

  • ์ƒ์† ๋!
  • final๋กœ ์„ ์–ธ๋œ ํด๋ž˜์Šค๋Š” ํ™•์žฅ๋  ์ˆ˜ ์—†๋‹ค. ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ final๋กœ ์„ ์–ธ๋œ ํด๋ž˜์Šค๋กœ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.

๋ฉ”์„œ๋“œ์— final

  • ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋!
  • final๋กœ ์„ ์–ธ๋œ ๋ฉ”์„œ๋“œ๋Š” ์˜ค๋ฒ„๋ผ์ด๋“œ ๋  ์ˆ˜ ์—†๋‹ค. ์ƒ์†๋ฐ›์€ ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.