Home Oop
Post
Cancel

Oop

OOP

아래 강의를 보고 정리했다.
객체지향 프로그래밍? 문과도 이해쌉가능. 10분컷.



객체지향 프로그래밍은 코드를 작성(정리)하는 방법이다.



예시

게임을 하는데 캐릭터 객체(object)가 필요하다.

한명의 캐릭터만 만든다면 아래와 같이 코딩하면 된다.

1
2
3
4
5
const character = {
    name : "nana",
    health : 75,
    skill : "Programmer",
}

하지만 그 숫자가 늘어나면 문제가 발생한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const character = {
    name : "nana",
    health : 75,
    skill : "Programmer",
}

const character1 = {
    name : "coco",
    health : 95,
    skill : "Legend",
}

const character2 = {
    name : "lula",
    health : 85,
    skill : "Normal",
}

해당 캐릭터들은 모두 같은 속성을 가지고 있으며 다른 점은 데이터 뿐이다.

여기서 문제는 캐릭터 구성에 대한 ‘구조’가 없다는 것이다.

skill을 빼먹는다거나 오타가 날 수 있다.


이렇게 코드 복제를 해서 캐릭터를 생성하는 것의 문제점은

새로운 속성 ‘성별’을 추가하고 싶다면 일일히 하나씩 추가해야한다는 점이다.


좋은 방법은 일종의 ‘캐릭터 팩토리’를 만드는 것이다.

→ 데이터만 넣으면 적용해주는 함수가 있고 캐릭터 객체를 output으로 얻을 수 있게 해준다.

→ 속성을 추가하고 싶으면 ‘캐릭터 팩토리’에서 속성 하나만 추가하면 된다.


이것이 바로 Class의 개념이다.




Class

Class는 객체를 위한 팩토리와 같은 것이다.

👉🏻 같은 속성을 갖고 있지만 데이터는 다른 경우


Class는 일종의 구조. 설계도로써 수많은 캐릭터들을 생산할 수 있다.

캐릭터 객체가 어떻게 보여야 하는지에 대한 도면을 정의해준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Character {
    String name;
    int health;
    String skill;

    public Character(String name, int health, String skill) {
        this.name = name;
        this.health = health;
        this.skill = skill;
    }

    public static void main(String[] args) {
        Character na = new Character("na", 75, "Programmer");
        Character coco = new Character("Coco", 95, "Legend");
        Character lula = new Character("Lula", 85, "Normal");
    }
}

이제는 코드를 복사할 필요가 없다.



또한 속성에 접근할 수도 있다.

1
2
Character coco = new Character("Coco", 95, "Legend");
System.out.println(coco.health);



Character coco = new Character(“Coco”, 95, “Legend”);의

‘coco’를 캐릭터 클래스의 인스턴스 혹은 객체로 지정한다.


여기서 인스턴스는 캐릭터 class를 사용한 후 얻을 수 있는 캐릭터에 속한다.




Method

1
2
3
4
5
6
7
8
9
class Character {
    String name;
    int health;
    String skill;

    public String greet() {
        return "안녕하세요. " + name + "입니다.";
    }
}

greet()는 함수이지만 클래스 내에 있기 때문에 Method(메소드)라고 부른다.

파라미터에 name을 주지 않아도 되는 이유는 필드에 변수 name을 선언하였고
생성자를 작성해서 name을 전달 받기 때문에 그 값을 받아 올 수 있으므로 파라미터를 작성하지 않아도 된다.




생성자

1
2
3
4
5
public Character(String name, int health, String skill) {
    this.name = name;
    this.health = health;
    this.skill = skill;
}

생성자는 멤버 변수의 초기화를 목적으로 가지는 함수 이므로 인수를 통해 값을 전달받을 수 있다.



모든 캐릭터가 health를 100으로 시작하게끔 프로그래밍 할 수도 있다.

1
2
3
4
5
public Character(String name, String skill) {
    this.name = name;
    this.health = 100;
    this.skill = skill;
}

this라는 단어는 캐릭터 클래스 내의 속성 및 메소드를 지칭하는 방법이다.




상속(Inheritance)

코드 중복을 줄이고 코드를 재사용 가능한 조각으로 나눌 수 있다.


자식 클래스가 부모 클래스의 속성을 갖게 된다.



Human.java

1
2
3
4
5
6
7
8
9
10
11
class Human {
    String name;
    Integer arms;
    Integer legs;

    public Human(String name) {
        this.name = name;
        this.arms = 2;
        this.legs = 2;
    }
}


🐣 만일 arms = 2를 모든 사람한테 적용시킨다면 아래와 같이 작성하면 된다.

1
2
3
4
5
6
7
8
9
10
class Human {
    String name;
    static final Integer arms = 2;
    Integer legs;

    public Human(String name) {
        this.name = name;
        this.legs = 2;
    }
}



Baby.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Baby {
    String name;
    Integer arms;
    Integer legs;
    boolean cute;

    public Baby(String name) {
        this.name = name;
        this.arms = 2;
        this.legs = 2;
        this.cute = true;
    }

    String cry() {
        return "waa";
    }
}



Teenager.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Teenager {
    String name;
    Integer arms;
    Integer legs;
    boolean emotional;

    public Teenager(String name) {
        this.name = name;
        this.arms = 2;
        this.legs = 2;
        this.emotional = true;
    }

    String curse() {
        return "#$!$@#$@#$@";
    }
}



여기서 코드 중복이 일어난다.

image



모든 클래스에 this.name, this.arms, this.legs를 적는 대신

this.name, this.arms, this.legs를 가진 클래스에서 확장 하면 된다.


해당 클래스는 ‘Human’이 된다.



Baby.java

1
2
3
4
5
6
7
8
9
10
11
12
class Baby extends Human {
    boolean cute;

    public Baby(String name) {
        super(name);
        this.cute = true;
    }

    String cry() {
        return "waa";
    }
}



Teenager.java

1
2
3
4
5
6
7
8
9
10
11
12
class Teenager extends Human {
    boolean emotional;
    
    public Teenager(String name) {
        super(name);
        this.emotional = true;
    }
    
    String curse() {
        return "#$!$@#$@#$@";
    }
}

Baby, Teenager 클래스가 Human 클래스의 속성을 모두 갖고 추가적으로 그들만의 다른 속성을 갖기를 원한다는 뜻이다.




코드 동작 시키기

Human의 이름을 정해주면 해당 코드는 동작한다.

단, Baby, Teenager 클래스에서 Human의 메소드를 호출하려면 해당 클래스에서 Super method 라는 것을 호출해야한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Baby extends Human {
    boolean cute;

    public Baby(String name) {
        super(name);
        this.cute = true;
    }

    String cry() {
        return "waa";
    }

    public static void main(String[] args) {
        Baby baby = new Baby("coco");
        System.out.println(baby.name);
        System.out.println(baby.arms);
        System.out.println(baby.legs);
        System.out.println(baby.cute);
        System.out.println(baby.cry());
    }
}

image

This post is licensed under CC BY 4.0 by the author.