BackEnd๐Ÿงต

2023.04.25 TIL(์ƒ์†๊ณผ ์บก์Šํ™”)

hae02y 2023. 4. 26. 01:01
๋ฐ˜์‘ํ˜•

 

๐Ÿ‘€Today...


Most powerful is he who has himself in his own power. - Seneca

 

 

โ˜•์˜ค๋Š˜์˜ TIL(Today I Learn)


์ƒ์†๊ณผ ํฌํ•จ๊ด€๊ณ„

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

public class Main {
    public static void main(String[] args) {
        Bike bike = new Bike();
        Car car = new Car();
        MotorBike motorBike = new MotorBike();
        
        bike.run();
        car.run();
        motorBike.run();
    }
}

class Vehicle {
    void run() {
        System.out.println("Vehicle is running");
    }
}

class Bike extends Vehicle {
    void run() {
        System.out.println("Bike is running");
    }
}

class Car extends Vehicle {
    void run() {
        System.out.println("Car is running");
    }
}

class MotorBike extends Vehicle {
    void run() {
        System.out.println("MotorBike is running");
    }
}

// ์ถœ๋ ฅ๊ฐ’
Bike is running
Car is running
MotorBike is running

 

ํฌํ•จ(Composite) ๊ด€๊ณ„๋Š” ์ƒ์†์ฒ˜๋Ÿผ ํด๋ž˜์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋กœ ํ™•์ธํ•˜์ž...!

public class Employee {
    int id;
    String name;
    Address address;			//์š”๋ถ€๋ถ„์ด ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด์„œ ํฌํ•จ๊ด€๊ณ„๋กœ ์‚ฌ์šฉ

    public Employee(int id, String name, Address address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    void showInfo() {
        System.out.println(id + " " + name);
        System.out.println(address.city+ " " + address.country);
    }

    public static void main(String[] args) {
        Address address1 = new Address("์„œ์šธ", "ํ•œ๊ตญ");
        Address address2 = new Address("๋„์ฟ„", "์ผ๋ณธ");

        Employee e = new Employee(1, "๊น€์ฝ”๋”ฉ", address1);
        Employee e2 = new Employee(2, "๋ฐ•ํ•ด์ปค", address2);

        e.showInfo();
        e2.showInfo();
    }
}

class Address {
    String city, country;

    public Address(String city, String country) {
        this.city = city;
        this.country = country;
    }
}

// ์ถœ๋ ฅ๊ฐ’
1 ๊น€์ฝ”๋”ฉ
์„œ์šธ ํ•œ๊ตญ
2 ๋ฐ•ํ•ด์ปค
๋„์ฟ„ ์ผ๋ณธ

 

# Object Class

object ํด๋ž˜์Šค๋Š” ์ž๋ฐ”์˜ ํด๋ž˜์Šค ์ƒ์† ๊ณ„์ธต๋„์—์„œ ์ตœ์ƒ์œ„์— ์œ„์น˜ํ•œ ํด๋ž˜์Šค์ด๋‹ค. ์ž๋ฐ”์˜ ๋ชจ๋“ ํด๋ž˜์Šค๋Š” Object ํด๋ž˜์Šค๋กœ ๋ถ€ํ„ฐ ํ™•์žฅ์ด ๋œ๋‹ค. ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ๋ถ€ํ„ฐ ์•„๋ฌด๋Ÿฐ ์ƒ์†์„ ๋ฐ›์ง€ ์•Š๋Š” ํด๋ž˜์Šค๋Š” ์ž๋™์œผ๋กœ extends Object๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

class ParentEx {  //  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ "extends Object" ์ž๋™ ์ถ”๊ฐ€ 
}

class ChildEx extends ParentEx {
}

 

 

Method Overriding

๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ์ƒ์œ„ํด๋ž˜์Šค๋กœ ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•˜๋Š”๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๋ ค๋ฉด ๋‹ค์Œ 3๊ฐ€์ง€ ์กฐ๊ฑด์ด ์„ฑ๋ฆฝ๋˜์•ผํ•œ๋‹ค.

  • ๋ฉ”์„œ๋“œ ์„ ์–ธ๋ถ€๊ฐ€ ์ƒ์œ„ํด๋ž˜์Šค์˜ ๊ทธ๊ฒƒ๊ณผ ์™„์ „ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.
  • ์ ‘๊ทผ์ œ์–ด์ž์˜ ๋ฒ”์œ„๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ๋„“์–ด์•ผ ํ•œ๋‹ค.
  • ์˜ˆ์™ธ๋Š” ์ƒ์œ„ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ๋งŽ์ด ์„ ์–ธํ• ์ˆ˜์—†๋‹ค.
public class Main {
    public static void main(String[] args) {
        Bike bike = new Bike();
        Car car = new Car();
        MotorBike motorBike = new MotorBike();
        
        bike.run();
        car.run();
        motorBike.run();
    }
}

class Vehicle {
    void run() {
        System.out.println("Vehicle is running");
    }
}

class Bike extends Vehicle {
    void run() {
        System.out.println("Bike is running");
    }
}

class Car extends Vehicle {
    void run() {
        System.out.println("Car is running");
    }
}

class MotorBike extends Vehicle {
    void run() {
        System.out.println("MotorBike is running");
    }
}

// ์ถœ๋ ฅ๊ฐ’
Bike is running
Car is running
MotorBike is running

 

 

super&super()

 

# super()

super()ํ‚ค์›Œ๋“œ๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ์ž์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋ฐ˜๋“œ์‹œ ์ฒซ์ค„์— ์™€์•ผ๋งŒ ํ•œ๋‹ค. ๋งŒ์•ฝ super()๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ž์‹ ์ƒ์„ฑ์ž์˜ ์ฒซ์ค„์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ super()๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค. ์ด๋•Œ ์ƒ์œ„ํด๋ž˜์Šค์— ๊ธฐ๋ณธ์ƒ์„ฑ์ž๊ฐ€ ์—†์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

public class Test {
    public static void main(String[] args) {
        Student s = new Student();
    }
}

class Human {
    Human() {
        System.out.println("ํœด๋จผ ํด๋ž˜์Šค ์ƒ์„ฑ์ž");
    }
}

class Student extends Human { // Human ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†
    Student() {    
        super(); // Human ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ํ˜ธ์ถœ
        System.out.println("ํ•™์ƒ ํด๋ž˜์Šค ์ƒ์„ฑ์ž");
    }
}

// ์ถœ๋ ฅ๊ฐ’
ํœด๋จผ ํด๋ž˜์Šค ์ƒ์„ฑ์ž
ํ•™์ƒ ํด๋ž˜์Šค ์ƒ์„ฑ์ž

 

# super

super ํ‚ค์›Œ๋“œ๋Š” ์ƒ์œ„ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋งŒ์•ฝ ๋ถ€๋ชจ์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์™€ ์ž์‹์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ด ๊ฐ™๋‹ค๋ฉด super.๋ถ€๋ชจ๋ฉค๋ฒ„๋ช…์„ ์ง€์ •ํ•˜์—ฌ ๋ถ€๋ชจ์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ช…์„ ๊ฐ€๋ฆฌํ‚ฌ์ˆ˜์žˆ๋‹ค.

public class Example {
    public static void main(String[] args) {
        SubClass subClassInstance = new SubClass();
        subClassInstance.callNum();
    }
}

class SuperClass {
    int count = 20; // super.count
}

class SubClass extends SuperClass {
    int count = 15; // this.count

    void callNum() {
        System.out.println("count = " + count);
        System.out.println("this.count = " + this.count);
        System.out.println("super.count = " + super.count);
    }
}


// ์ถœ๋ ฅ๊ฐ’
count = 15
count = 15
count = 20

 

 

์บก์Šํ™”์™€ ํŒจํ‚ค์ง€

์บก์Šํ™”๋Š” ํŠน์ •๊ฐ์ฒด ์•ˆ์— ๊ด€๋ จ๋œ ์†์„ฑ๊ณผ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ ์บก์Š๋กœ ๋งŒ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€๋กœ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ณดํ˜ธ์™€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€๋…ธ์ถœ๋กœ๋ถ€ํ„ฐ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. (data hiding)

 

ํŒจํ‚ค์ง€(package)๋Š” ํŠน์ •ํ•œ ๋ชฉ์ ์„ ๊ณต์œ ํ•˜๋Š” ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฌถ์Œ์„ ์˜๋ฏธํ•˜๊ณ  ์ž๋ฐ”์—์„œ์˜ ํŒจํ‚ค์ง€๋Š” ๋ฌผ๋ฆฌ์ ์ธ ํ•˜๋‚˜์˜ directory์ด๋‹ค. ์ด directory๋Š” ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๊ณ„์ธต๊ฐ„์˜ ๊ตฌ๋ถ„์€ (.)์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ํŒจํ‚ค์ง€์˜ ์žฅ์ ์€ ํด๋ž˜์Šค์˜ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•ด์ค€๋‹ค. ๊ฐ™์€ ์ด๋ฆ„์˜ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋”๋ผ๋„ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ์†Œ์†๋˜๋ฉด ์ด๋ฆ„๋ช…์œผ๋กœ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

ํŒจํ‚ค์ง€์˜ ์„ ์–ธ์€ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์„ ์–ธํ•œ๋‹ค.

package practicepack.test2; // import ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ํด๋ž˜์Šค ์‚ฌ์šฉ๋ฐฉ๋ฒ•

public class PackageImp {
		public static void main(String[] args) {
			practicepack.test.ExampleImport example = new practicepack.test.ExampleImport();
		}
}

ํ•˜์ง€๋งŒ ์œ„์™€๊ฐ™์ด ๋‹ค๋ฅธํŒจํ‚ค์ง€์˜ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„ ์–ธ์‹œ์— ํŒจํ‚ค์ง€๋ช…์„ ๋ชจ๋‘ ํฌํ•จ์‹œ์ผœ์„œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค. ์ด๋ฅผ ์ข€๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด import์ด๋‹ค. ์‚ฌ์šฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

package practicepack.test;

public class ExampleImp {
		public int a = 10;
		public void print() {
			System.out.println("Import ๋ฌธ ํ…Œ์ŠคํŠธ")
}
package practicepack.test2; // import ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

import practicepack.test.ExampleImp // import ๋ฌธ ์ž‘์„ฑ

public class PackageImp {
		public static void main(String[] args) {
			ExampleImp x = new ExampleImp(); // ์ด์ œ ํŒจํ‚ค์ง€ ๋ช…์„ ์ƒ๋žต ๊ฐ€๋Šฅ
		}
}

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ํŒจํ‚ค์ง€๋ช…์„ ์ƒ๋žตํ•˜๊ณ  ํด๋ž˜์Šค์— ๋ฐ”๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

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

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

ํ”„๋ผ์ด๋น—(private) : ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๋””ํดํŠธ(default) : ๊ฐ™์€ ํŒจํ‚ค์ง€๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ”„๋กœํ…ํ‹ฐ๋“œ(protected) : ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†์ง€๋งŒ, ์ƒ์† ๋ฐ›์€ ์ž์‹ ํด๋ž˜์Šค์—์„œ๋Š” ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํผ๋ธ”๋ฆญ(public) : ์ ‘๊ทผ ์ œํ•œ์ด ์—†๋‹ค. ๋‹ค๋ฅธ ํŒจํ‚ค์ง€, ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

getter / setter method

getter /setter ๋ฉ”์„œ๋“œ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ private ์ ‘๊ทผ์ž๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ๋Š” ๊ฐ์ฒด์˜ ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์„๋•Œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. setter๋Š” ๋ฐ์ดํ„ฐ๊ฐ’์„ ๋ณ€๊ฒฝํ• ์ˆ˜์žˆ๊ฒŒ ํ•ด์ฃผ๊ณ , getter๋Š” ์„ค์ •ํ•œ ๋ณ€์ˆ˜๊ฐ’์„ ์ฝ์–ด์˜ค๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์ž. 

 public class GetterSetterTest {
    public static void main(String[] args) {
        Worker w = new Worker();
        w.setName("๊น€์ฝ”๋”ฉ");
        w.setAge(30);
        w.setId(5);

        String name = w.getName();
        System.out.println("๊ทผ๋กœ์ž์˜ ์ด๋ฆ„์€ " + name);
        int age = w.getAge();
        System.out.println("๊ทผ๋กœ์ž์˜ ๋‚˜์ด๋Š” " + age);
        int id = w.getId();
        System.out.println("๊ทผ๋กœ์ž์˜ ID๋Š” " + id);
    }
}

class Worker {
    private String name; // ๋ณ€์ˆ˜์˜ ์€๋‹‰ํ™”. ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ ‘๊ทผ ๋ถˆ๊ฐ€
    private int age;
    private int id;

    public String getName() { // ๋ฉค๋ฒ„๋ณ€์ˆ˜์˜ ๊ฐ’ 
        return name;
    }

    public void setName(String name) { // ๋ฉค๋ฒ„๋ณ€์ˆ˜์˜ ๊ฐ’ ๋ณ€๊ฒฝ
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age < 1) return;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

// ์ถœ๋ ฅ๊ฐ’
๊ทผ๋กœ์ž์˜ ์ด๋ฆ„์€ ๊น€์ฝ”๋”ฉ
๊ทผ๋กœ์ž์˜ ๋‚˜์ด๋Š” 30
๊ทผ๋กœ์ž์˜ ID๋Š” 5

 

 

 


๐Ÿ‘Šํ˜ผ์ž์„œ ํ•ด๊ฒฐํ•˜๊ธฐ


 

 

 

๋ฐ˜์‘ํ˜•