티스토리 뷰

반응형

자바는 객체 지향 프로그래밍 언어이다

객체라는 것이 굉장히 추상적인 의미인데 모든 것을 객체라고 보면 될 듯하다

지금 우리가 들이마시고 있는 공기, 보고 있는 화면, 불현듯 머릿속에 떠오른 아이디어까지

프로그래밍 세계에서 이것을 객체(Object)라고 부른다

#객체의 특성

객체를 이해하기 위해서는 이것이 가지고 있는 특성부터 이해하는 게 좋겠다

1. 객체는 고유하다

예를 들어 자동차라고 한다면 자동차라는 고유한 의미를 가지고 있다

 

2. 객체는 속성을 갖는다

자동차는 브랜드, 가격, 색상 등등의 속성을 갖는다

 

3. 객체는 행위를 한다

자동차는 도로 위를 주행하는 행위를 한다

 

자 그렇다면 사람들을 이동시킬 수 있고 도로 위를 주행하며 고유한 의미를 가지고 있으면 모두 자동차일까? 답은 아니다

이는 오토바이가 될 수도 있고, 버스가 될 수도 있고, 자전거가 될 수도 있다

이들을 구분할 수 있는 건 "운송수단"이라는 분류(Class) 일 것이다

 

다시 이를 프로그래밍 세계로 가지고 온다면

자동차(Object)는 브랜드, 가격 등의 속성(Property)을 가지고 주행이라는 행위(Method)를 하며 운송수단으로 분류(Class)된다

 

public class Transportation {

    public class Car {
        private String brand;
        private int price;
        private String color;
    }

    public void Drive(String highway) {
        System.out.println(highway + "를 달립니다");
    }

}

 

#객체 지향의 특성

객체를 알았으니 객체지향의 특성도 알아보자

 

1. 추상화(Abstraction): 모델링

추상화를 쉽게 이해하기 위해 비즈니스 모델을 생각해보자

예를 들어 은행 애플리케이션과 병원 애플리케이션이 있다고 하자

그리고 은행이든 병원이든 이를 이용하는 것은 사람이다 (사람이라는 객체)

 

은행에서의 사람은 고객일 것이고

병원에서의 사람은 환자일 것이다

 

사람이라는 객체에는 다양한 속성과 행위가 존재한다

이때 은행 애플리케이션을 만든다고 하면 이 사람의 몸무게 키 시력 등은 필요 없다

또한 대출이라는 행위가 있어야 은행 애플리케이션에 메인 로직을 실행할 수 있을 것이다

public class person {
	private String name;
    private int age;
}

private void borrow() {
}

이렇게 목적과 관심에 맞게 특성만을 추출해서 표현하는 것을 바로 추상화(모델링)이라고 한다

 

2. 상속(inheritence, extends) : 재사용+확장

우리가 일반적으로 생각하는 상속은 부모가 자식에게 물려주는 계층형의 상속을 생각하지만

프로그램 세계의 상속은 계층형이 아니라 분류형이라고 본다

상속은 계층형이 아닌 분류형

상속을 이해하기 위해서 가장 중요한 개념은 "is kind of"라는 개념인데

포유류는 동물에 속해있다 = is kind of

조류도 동물에 속해있다 = is kind of

 

public class animal {
	String animalType;
}

public class mammal extends animal {
	animalType = "mammal";
}

객체지향의 상속을 정리해보자면 아래와 같을 것이다

• 하위 클래스(mammal)가 상위 클래스(animal)의 특성을 재사용한다

• 상위 클래스의 특성을 확장한다

• is a kind of 관계를 만족해야 한다

 

3. 다형성 : 사용 편의성

앞서 말한 상속과 오버 라이딩(overriding) 그리고 오버 로딩(overloading)을 활용하면 객체 지향에 다형성 적용할 수 있다

주행한다는 행위가 있다, 근데 객체를 살펴보니 자동차와 오토바이가 있다

 

이때 이 둘의 객체는 똑같이 도로를 주행하니 주행한다는 메서드(행위)만 상속받아 사용하면 될 것 같다

하지만 모두가 알다시피 자동차는 바퀴가 4개이고 오토바이는 바퀴가 2개이다

같은 메서드로 4개의 바퀴로도 달리고 2개의 바퀴로도 달리게 하려면 어떻게 해야 할까? 혹은 주행하게 하고 싶지 않다면?

이때 오버 라이딩과 오버 로딩의 개념이 필요하다

 

- 오버 라이딩(overriding) : 재정의

부모 클래스에게 메서드를 상속받은 자식 클래스가 이 메서드를 다시 재정의해서 사용하는 것

public class Transportation {

    public void drive(int tireNumber) {
        System.out.println( tireNumber + "run");
    }
    
}

public class Car extends Transportation{

    @Override
    public void drive(int tireNumber) {
        super.drive(tireNumber);
    }
 }

- 오버 로딩 (overloading) : 중복 정의

부모 클래스에게 메서드를 상속받은 자식 클래스가 같은 이름으로 사용하지만 다른 결과물을 만들어 내는 것 (다른 인자 리스트를 가져야 한다)

public class Car extends Transportation{

	public void drive(int tireNumber, int fuel) {
        if (fuel < 10) {
            System.out.println("no run");
        }
    }
    
}

 

4. 캡슐화 : 정보 은닉

객체가 다른 객체에 접근할 경우에는 객체를 새로 생성해야 한다

이때 접근 제어자를 사용하여 접근에 제한 조건을 줄 수 있다

• public : 클래스 외부에서 접근 가능

• protected : 상속 / 같은 패키지 내의 클래스에서 접근 가능

• default : 같은 패키지 내의 클래스에서 접근 가능

• private : 클래스 내부에서만 접근 가능

 

이렇게 객체 지향에는 4가지의 특성이 있다

이제 이런 특성들을 활용하여 어떻게 객체지향스럽게 설계해야 하는지 이를 위한 5가지 원칙 SOLID를 뒤에서 알아보겠다

 

반응형
댓글