[Java] 객체지향

2022. 11. 14. 22:55Programming/Java

 

자바는 객체지향 언어라고 한다. 그렇다면 이 객체지향이란 것은 무엇을 의미하는 것일까?

 

객체(Object)

 

 객체(object)를 어렵게 생각하지 않고 우리가 알고 있는 하나의 대상이라고 생각한다. 즉 사람, 의자, 음식, 동물 같은 대상들을 각자의 범주로 묶어서 표현한 것을 객체라고 한다. 즉 객체지향이란 각 대상이 다른 대상에게 행동을 요청하고 응답을 받으며 상호작용하는 것으로 이해하였다.

 

객체지향의 특성

  • 캡슐화
  • 상속
  • 다형성

 

흔히 이 세가지를 객체지향의 특성이라고 한다. 그럼 이제부터 기본 개념부터 특성까지 정리해보자.

 

 

캡슐화

 

캡슐화를 이해할 때 몇 가지를 알고 넘어가야 한다. 바로 클래스, 필드, 메서드이다.

 

클래스

  • 표현하고자 하는 객체, 대상의 공통 속성을 하나에 정의한 것
  • 객체의 속성을 정의해 놓은것
class Phone {
    String model;
    String color;
    int price;
}

 

  • 필드 ( 멤버 변수 )와 메서드 ( 멤버 함수 )로 구성되어있다.
    • 필드 - 멤버 변수는 각 대상이 가지는 특징이라 생각한다
      • 만약 표현하고자 하는 객체가 사람이라면 이름, 특징, 취미, 나이 등을 필드라고 생각한다
      • 위의 코드에서는 model / color / price가 바로 필드이다.
    •  메서드 - 멤버 함수의 경우 각 대상이 할 수 있는 능력이라 생각한다
      • 메서드의 필요성
        • 재사용성 : 한 번 생성 시 반복적 재사용 가능
        • 중복된 코드의 제거 : 반복적으로 작성된 코드를 줄여서 효율성 ↑ 
      • 달리기, 걷기 등의 각 대상이 할 수 있는 것을 표현한 것이라 생각한다.
반환타입 메소드이름 (타입 변수명,타입 변수명, ...){ 
    수행되어야 할 코드
}
//
int add(int x, int y) {
    int result = x + y;
    return result;
}
  • Ex 
    • 붕어빵 틀 - 클래스 - 붕어빵을 만드는데 이용 /  붕어빵 - 객체 - 인스턴스
    • 자동차 - 클래스 - 자동차라는 이동수단의 종류 / suv , 스포츠카 - 객체  - 인스턴스

 

  • 생성자 
    • 인스턴스가 생성될 때 사용되는 '인스턴스 초기화 메서드'이다. 
    • new와 같은 키워드로 해당 클래스의 인스턴스가 생성될 때 자동으로 호출
// 생성자의 형식
클래스이름 (타입 변수명, 타입 변수명, ...){
    인스턴스 생성 될 때에 수행하여할 코드
    변수의 초기화 코드
}

// 매개변수가 지정된 생성자
Phone(String model, String color, int price) {
        this.model = model;
        this.color = color;
        this.price = price;
    }
}

// 매개변수가 지정되지않은 생성자
Phone(){
}

 

  • 인스턴스 : 클래스에서 만들어진 객체를 의미, 위의 Phone 클래스를 통해 만들어진 갤럭시와 아이폰 객체
Phone galaxy = new Phone(); 
galaxy.model = "Galaxy10";
galaxy.color = "Black";
galaxy.price = 100;
        
Phone iphone =new Phone();
iphone.model = "iPhoneX";
iphone.color = "Black";
iphone.price = 200;

 

그럼 이제 캡슐화란 무엇인가?

 

흔한 예제는 바로 캡슐약이다. 캡슐약은 안에 있는 약을 보호하기 위해 위장에서 녹는 캡슐로 덮여있고

이는 안에 있는 약품을 보호하는 역할을 한다.

 

이러한 캡슐을 객체지향에서도 가져온 것이다. 캡슐은 약에서의 기능처럼 객체 내부를 보호하는 역할을 한다.

이러한 역할을 통해 객체는 본인의 내부를 보여주지 않고 일부분만 노출하여 상호작용을 위한 부분만 노출시킨다.

 

상속(Inheritance)

 

강아지 / 사람 / 고양이 / 포유류 / 파충류 / 식물 / 곤충... etc 모든 생명이 있는 것들은 생물이라는 최상위 카테고리가 존재한다. 이때 생물이라는 카테고리에서 동물 / 식물이 갈라지듯 각 카테고리의 속성은 그 아래 하위 카테고리에 물린다. 

 

사람 → 포유류   동물   생물

 

객체지향 언어인 자바에서 이 또한 구현이 되었으며 이를 바로 상속이라 한다.

상속은 속성을 물려주는 클래스가 부모(슈퍼) 클래스, 속성을 물려받는 클래스가 자식(서브) 클래스이다.

 

상속을 통해 슈퍼클래스의 메서드를 서브클래스가 물려받기에 적은 양의 코드를 가지고 서브 클래스를 구현할 수 있다.

 

class Animal{
	String name;
    int age;
    void eat(){}
    void sleep(){}
    void love(){}
}

class Human extends Animal{
	String hobby;
    String job;
    void work(){}
    void cry(){}
    void laugh(){}
}

// human 클래스의 경우 animal 클래스를 상속받으며 animal의 메서드들을 사용할 수 있게된다.

 

다형성

 

같은 메서드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현하는 것

 

  • 오버 로딩
    • 기존에 있던 새로운 메서드를 생성, 이름이 겹쳐도 안에 들어가는 매개변수의 개수나 데이터 타입이 틀린 경우
int add(int x, int y, int z) {
    int result = x + y + z;
    return result;
}

long add(int a, int b, long c) {
    long result = a + b + c;
    return result;
}

int add(int a, int b) {
    int result = a + b;
    return result;
}

 

  • 오버 라이딩
    • 슈퍼클래스로부터 상속받은 메서드를 변경하는 것
    • 슈퍼클래스로부터 메서드를 상속받아도 해당 메서드를 서브클래스에 맞게 고치는 것
    • 이름이 같아야 하며 /  매개변수가 같아야 하고 /  반환 타입이 같아야 한다
class Parent {
    String name;

    public void play() {
        System.out.println(name + " is playing.");
    }
}

class Child extends Parent {

    Child(String name) {
        this.name = name;
    }

    public void play() {
        System.out.println(name + " is playing in ground !");
    }
}