Oop.md


์š”์ฆ˜์—๋Š” ๋Œ€๋ถ€๋ถ„์ด ๋‹น์—ฐํ•œ ๋ฌธ๋ฒ•์ด๋ผ๊ณ  ๋ฐฐ์šฐ๊ณ  OOP๋กœ ๊ฐœ๋ฐœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ผ๋งˆ๋‚˜ ํš๊ธฐ์ ์ธ ์•„์ด๋””์–ด์ธ์ง€ ๋ชจ๋ฅด์ง€๋งŒ, C์™€ ๊ฐ™์€ ์ ˆ์ฐจ์ง€ํ–ฅ์–ธ์–ด๋ฅผ ๋จผ์ € ๊ฒฝํ—˜ํ•ด๋ณธ ์‚ฌ๋žŒ๋“ค์€ ์–ผ๋งˆ๋‚˜ ์‹ ์„ธ๊ณ„์ธ ๊ฐœ๋…์ธ์ง€ ๋А๋‚„ ๊ฒƒ์ด๋‹ค.

์ ˆ์ž ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Procedual Programming)์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ๋ฐ˜๋ฉด ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(์ดํ•˜ OOP)๋Š” ๊ฐ์ฒด ๋“ค์˜ ์œ ๊ธฐ์ ์ธ ๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.

OOP


OOP๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„ค๊ณ„ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ค‘ ํ•˜๋‚˜๋กœ, ํ˜„์‹ค ์„ธ๊ณ„๋ฅผ ํ”„๋กœ๊ทธ๋žจ ์„ค๊ณ„์— ๋ฐ˜์˜ํ•œ๋‹ค๋Š” ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค.

oopimage

OOP์˜ ์žฅ๋‹จ์ 

์žฅ์ 

  • ์œ ์—ฐ์„ฑ -> ๋ณ€๊ฒฝ, ๊ฐœ๋ฐœ ๋ฐ ๋ณด์ˆ˜ ์šฉ์ด

  • ์ง๊ด€์ ์ธ ์ฝ”๋“œ ๋ถ„์„ ๊ฐ€๋Šฅ

  • ๊ฐ•ํ•œ ์‘์ง‘๋ ฅ, ์•ฝํ•œ ๊ฒฐํ•ฉ๋ ฅ

์‘์ง‘๋ ฅ? ๊ฒฐํ•ฉ๋ ฅ?

  • ์‘์ง‘๋ ฅ(cohesion)

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

  • ๊ฒฐํ•ฉ๋ ฅ(coupling)

ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์˜ ํ•œ ์š”์†Œ๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ์–ผ๋งˆ๋‚˜ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€, ์–ผ๋งˆ๋‚˜ ์˜์กด์ ์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •๋„ -> ๊ฒฐํ•ฉ๋ ฅ์ด ๋‚ฎ๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ์š”์†Œ๋“ค๊ณผ ๊ด€๊ณ„๋ฅผ ํฌ๊ฒŒ ๋งบ๊ณ  ์žˆ์ง€ ์•Š๊ณ  ๋œ ์˜์กด์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

OOP๋Š” ํ•˜๋‚˜์˜ ๋ฌธ์ œํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„ ๋†“์€ ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€ํ–ฅํ•˜๋ฏ€๋กœ ์‘์ง‘๋ ฅ์„ ๊ฐ•ํ™”ํ•˜๋ฉฐ, ํด๋ž˜์Šค ๊ฐ„์— ๋…๋ฆฝ์ ์œผ๋กœ ๋””์ž์ธํ•จ์œผ๋กœ์จ ๊ฒฐํ•ฉ๋ ฅ์„ ์•ฝํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ

Object - ๊ฐ์ฒด

๊ฐ์ฒด๋Š” ๋Œ€์ƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๊ตฌ์„ฑ์š”์†Œ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๊ฐ์ฒด๋ผ๊ณ  ํ•œ๋‹ค.

ex) ์‚ฌ๊ณผ, ์›์ˆญ์ด, ์˜์ž ๋“ฑ๋“ฑ

Class

๊ฐ์ฒด๋“ค์ด ๊ณตํ†ต์ ์œผ๋กœ ๊ฐ–๋Š” ์†์„ฑ(attribute)์™€ ํ–‰์œ„(method)๋ฅผ ์ •์˜ํ•œ๋‹ค.

OOP์—์„œ ์ฝ”๋“œ ์ž‘์„ฑ์˜ ๊ธฐ๋ณธ ๋‹จ์œ„์ด๋ฉฐ ๊ฐ์ฒด๋ฅผ ์ด๋ฃจ๋Š” ํ‹€์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋ฅธ ํด๋ž˜์Šค์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋””์ž์ธํ•ด์•ผํ•œ๋‹ค.

Object to Class ๋ถ•์–ด๋นต - ๊ฐ์ฒด ๋ฟก์–ด๋นตํ‹€ - ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” Class

Method - ๋ฉ”์„œ๋“œ

ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•, ์ฆ‰ ๊ฐ์ฒด๋“ค์˜ ์†์„ฑ์„ ์กฐ์ž‘ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

ex) ์ฑ…์ƒ(object)์„ ๋“ ๋‹ค. -> Method

๐Ÿ’กํŠน์„ฑ

์บก์Аํ™” - Encapsulation

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

  • ์ •๋ณด์˜ ์€๋‹‰ํ™” ์บก์Аํ™”๋ฅผ ํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ด์œ ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ๋‹ค. ๋งŒ์•ฝ ์€ํ–‰์ด๋ผ๋Š” ํด๋ž˜์Šค์— ์ž”๊ณ ๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ public์œผ๋กœ ์ง€์ •๋˜์–ด์žˆ๋‹ค๋ฉด ์™ธ๋ถ€์—์„œ ์ž”๊ณ  ์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฉ”์„œ๋“œ๋กœ ์ด๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ์˜ ๋ณด์•ˆ ์„ฑ์— ๋”ฐ๋ผ private, protected ์™€ ๊ฐ™์€ ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ์ž˜ ๋ถ™์—ฌ ์„ ์–ธํ•˜๊ณ  getter, setter, property์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค.

class BankBook {
    public int balance = 2000;
    public void changeBalance(int new_balance){
        self.balance = new_balance;
    }
}
  • ์ด๋ ‡๊ฒŒ ์ฝ”๋”ฉํ•œ๋‹ค๋ฉด ์ž์œ ๋กญ๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜์—ฌ ๋ณด์•ˆ์„ฑ์ด ์นจํ•ด๋œ๋‹ค.

class BankBook {
    private int balance = 2000;
    protected void balanceSetter(int new_balance){
        self.balance = new_balance;
    }
    protected int balanceGetter(){
        return self.balance
    }
}
  • ์œ„์™€ ๊ฐ™์ด setter, getter๋ฅผ ์ด์šฉํ•ด ๋ณด์•ˆ์„ฑ์„ ๊ฐ•ํ™”ํ•œ๋‹ค.

์ถ”์ƒํ™” - Abstraction

์ถ”์ƒํ™”๋Š” ๊ฐ์ฒด๋“ค์ด ๊ฐ€์ง„ ๊ณตํ†ต์˜ ํŠน์„ฑ๋“ค์„ ํŒŒ์•…ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ํŠน์„ฑ๋“ค์„ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ๊ฐ์ฒด๋“ค์ด ๊ฐ€์ง„ ๋™์ž‘์„ ๊ธฐ์ค€์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ, ์†์„ฑ์œ„์ฃผ๊ฐ€ ์•„๋‹Œ ๋™์ž‘ ์œ„์ฃผ๋กœ ์ž‘์—… ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ๊ฐ์ฒด์˜ ๋™์ž‘์— ์—ฐ๊ด€์ด ๋˜์ง€ ์•Š๋Š” ์†์„œ๋“ค์€ ๊ฒฉ๊ตญ์€ ๋ถˆํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์ž‘์„ ๋จผ์ € ์ •์˜ํ•˜๊ณ  ๋™์ž‘์— ํ•„์š”ํ•œ ์†์„ฑ๋“ค์„ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋‹คํ˜•์„ฑ - Polymorphism

๊ฐ™์€ ์ž๋ฃŒํ˜•์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ฐ์ฒด๋ฅผ ๋Œ€์ž…ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด๋‚ด๋Š” ์„ฑ์งˆ์„ ๋งํ•œ๋‹ค. ํ•˜๋‚˜์˜ ํƒ€์ž…์œผ๋กœ ๋‹ค์–‘ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ์ฒด๋ฅผ ๋ถ€ํ’ˆํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๋‹ค. ์ฃผ๋กœ interface๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

interface Homework{
    void readingHw();
    void writingHw();
}
class AClass implements Homework {
    public void readingHw(){ //Overring
        System.out.println("์šด์˜์ฒด์ œ ์ฑ… 60P๊นŒ์ง€")
    }
    public void writingHw(){ //Overring
        System.out.println("java ๋‹คํ˜•์„ฑ interface๋กœ ๊ตฌํ˜„")
    }
}

class BClass implements Homework {
    public void readingHw(){ //Overring
        System.out.println("์ž๋ฃŒ๊ตฌ์กฐ ์ฑ… 45P๊นŒ์ง€")
    }
    public void writingHw(){ //Overring
        System.out.println("java ์ƒ์† ๊ตฌํ˜„")
    }
}
public class TestCode01 {
    public static void main(String[] args){
        Homework hw1;
        hw1 = AClass();
        hw1.readingHw();
        hw1.writingHw();

        Homework hw2;
        hw2 = BClass();
        hw2.readingHw();
        hw2.writingHw();

    }
}

์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ, ๊ฐ์ฒด์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅด ํ†ตํ•ด ์œ„์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋‹คํ˜•์„ฑ์ด๋‹ค.

์ƒ์†์„ฑ - Inheritance

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

class A {
    String aField = "afield";
    public void Amethod(){
        System.out.println("Class A's Field: ", aField);
    }
}
class B extends A {
    public void Bmethod(){
        Amethod()
    }
}

Last updated