Language/JAVA

5주차 과제: 클래스

목표

자바의 Class에 대해 학습하세요.

학습할 것 (필수)

  • 클래스 정의하는 방법
  • 객체 만드는 방법 (new 키워드 이해하기)
  • 메소드 정의하는 방법
  • 생성자 정의하는 방법
  • this 키워드 이해하기

마감일시

2020년 12월 19일 토요일 오후 1시까지.

과제 (Optional)

  • int 값을 가지고 있는 이진 트리를 나타내는 Node 라는 클래스를 정의하세요.
  • int value, Node left, right를 가지고 있어야 합니다.
  • BinrayTree라는 클래스를 정의하고 주어진 노드를 기준으로 출력하는 bfs(Node node)와 dfs(Node node) 메소드를 구현하세요.
  • DFS는 왼쪽, 루트, 오른쪽 순으로 순회하세요.

객체 지향 프로그래밍

부품들을 제작하고 조립하여 완성된 제품을 만들 듯이, 부품에 해당하는 객체를 만들고, 이것들을 하나씩 조립하여 완성된 프로그램을 제작하는 기법을 객체 지향 프로그래밍 (OOP: Object Oriented Programming)이라고 한다.

객체 지향 프로그래밍을 이해하기 위해서는 우선 객체의 개념과 객체의 상호작용에 대해 알아두어야 한다.

 

객체란?

객체(Object)란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것을 말한다. 예를 들어 물리적으로 존재하는 자동차, 자전거, 책, 사람과 추상적인 학과, 강의, 주문 등이 모두 객체가 될 수 있다. 객체는 속성과 동작으로 구성되어 있다.

자동차는 색상, 모델명 등이 속성에 해당하고, 달린다, 멈춘다 등의 동작에 해당하는데

이 속성과 동작을 각각 필드(field)와 메서드(method)라고 부른다.

현실 세계의 객체를 소프트웨어 객체로 설계하는 것을 객체 모델링 (Object Modeling)이라고 한다.

객체 모델링은 현실 세계의 객체의 속성과 동작을 추려내어 소프트웨어 객체의 필드와 메서드로 정의하는 과정이라고 볼 수 있다.

 

객체의 상호작용

현실 세계에서 일어나는 모든 현상은 객체와 객체 간의 상호작용으로 이루어져 있다.

예를 들어 사람은 전자계산기의 기능을 이용하고, 전자 계산기는 계산 결과를 사람에게 알려주는 상호작용을 한다.

 

소프트웨어에서도 마찬가지로 객체들은 각각 독립적으로 존재하고, 다른 객체와 상호작용 하면서 동작한다.

객체들 사이의 상호작용 수단은 메서드이다. 객체가 다른 객체의 기능을 이용하는 것이 바로 메서드 호출이다.

 

사람 -> (더하기 기능 이용) -> 계산기

사람 <- ( 결과 리턴 ) <- 계산기

 

public static void main(String[] args) {
	
   int result = 0;
   Person person = new Person();
   result = person.calculator.Add(10, 20);
   person.useCalculator(result);
}

Class Person {
	
    Calculator calculator = new Calculator();
    public void useCalculator(int value) {
    	System.out.println();
    }
}

Class Calculator {
	public int Add(int firstValue, int secondValue) {
    	return firstValue + secondValue;
    }
}

 

객체 간의 관계

객체는 개별적으로 사용될 수 있지만, 대부분 다른 객체와 관계를 맺고 있다. 이 관계의 종류에는 집합 관계, 사용 관계, 상속 관계가 있다. 집합 관계에 있는 객체는 하나의 부품이고 하나는 완성품에 해당한다.

예를 들어 자동차는 엔진, 타이어, 핸들 등으로 구성되므로 자동차와 이 부품들은 집합의 관계라고 볼 수 있다.

사용 관계는 객체 간의 상호 작용을 말한다. 객체는 다른 객체의 메소드를 호출하여 원하는 결과를 얻어낸다.

예를 들어 사람은 자동차를 사용하므로 사람과 자동차는 사용의 관계라고 볼 수 있다.

상속 관계는 상위(부모) 관계를 객체를 기반으로 하위(자식) 객체를 생성하는 관계를 말한다.

일반적으로 상위 객체는 종류를 의미하고, 하위 객체는 구체적인 사물에 해당한다.

OOP는 만들고자 하는 완성품인 객체를 모델링하고, 집합 관계에 있는 부품 객체와 사용 관계에 있는 객체를 하나씩 설계한 후 조립하는 방식으로 프로그램을 개발하는 기법이다.

 

이것이 자바다 신용권의 Java프로그래밍 정복의 객체간의 관계 이미지

 

 

객체지향 프로그래밍 원칙

 

두문자 약어 개념
S SRP 단일 책임 원칙 (Single responsibility principle) 클래스는 하나의 책임만 가져야 한다.
O OCP 개방-폐쇄 원칙 (Open/closed principle)“소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.”
L LSP 리스코프 치환 원칙 (Liskov substitution principle)“프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.” 계약에 의한 설계를 참고하라.
I ISP 인터페이스 분리 원칙 (Interface segregation principle)“특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.”[4]
D DIP 의존관계 역전 원칙 (Dependency inversion principle)프로그래머는 “추상화에 의존해야지, 구체화에 의존하면 안된다.”[4] 의존성 주입은 이 원칙을 따르는 방법 중 하나다.

 

객체지향 프로그래밍의 특징

 

  • 캡슐화 (Encapsulation)
    • 캡슐화란 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것을 말한다.
    • 외부 객체는 객체의 내부 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다.
    • 외부의 잘못된 사용으로 객체가 손상되지 않도록 하기 위해 사용한다.
    • 객체를 노출하거나 숨기는 여부에 따라 접근제한자(Access Modifier)를 사용한다. 
    • 객체의 필드와 메소드의 사용 범위를 제한함으로써 외부로부터 보호한다.
  • 상속 (Inheritance) 
    • 부모가 가지고 있는 필드, 메서드를 자식이 물려받는것
    • 현실 세계와 달리 자식이 부모를 선택하여 상속받을 수 있다.
    • 상위 객체를 재사용해서 하위 객체를 쉽고 빨리 설계할 수 있도록 도와준다.
    • 반복된 코드의 중복을 줄여준다.
    • 유지 보수 시간을 최소화
    • 객체의 다형성을 구현할 수 있다.
  • 추상화 (Abstraction)
    • 실체간의 공통된 특성을 추출하는 것을 말한다.
    • 추상 클래스와, 인터페이스로 구현할 수 있다.
    • 객체를 직접 생성해서 사용할 수 없다. (new 연산자로 인스턴스 생성 불가)
    • 실체 클래스들의 공통된 필드와 메소드이 이름을 통일할 목적을 가진다.
    • 실체 클래스를 작성할 때 시간을 절약할 수 있다.
    • 추상화는 상속을 위해 만드는 지침서 같은 개념이라고 생각한다.
  • 다형성 (Polymorphism)
    • 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
    • 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 만들어 준다.
    • 자바는 다형성을 위해 부모 클래스 또는 인터페이스 타입 변환을 허용한다.
    • 부모 타입에는 모든 자식 객체가 대입될 수 있고, 인터페이스 타입에는 모든 구현 객체가 대입될 수 있다.

 

 

객체 지향 프로그래밍에 대해서는 객체지향의 사실과 오해라는 책을 다시 읽고 정리해서 올려보도록 하겠습니다.

더보기

이 책을 간단히 요약하면 '객체간의 협력 (적절한 메시지)를 기반으로 만들어진 객체에 적절한 역할과 책임에서 나온다' 라는 것이다.

실세계의 모방이 아닌 새로운 세계의 구축

하지만 초보자 입장에서는 자율적인 객체를 이해하는데 현실세계를 모방해서 가져오는 것이 효과적이다.

현실세계의 메뉴판은 그저 있을 뿐이지만 객체에서의 메뉴판이 스스로 어떤 메뉴가 있는지 알려줄 수 있는 자율성을 가진다.

도메인 모델(사람이 보편적으로 생각하는 개념)은 크게 흔들리지 않는다. 비지니스가 없어지거나 완전 개편 되지 않는 한 안정적

안정적인 도메일 모델을 기반으로 시스템의 기능을 구현하면 시스템의 기능이 변경되더라도 비즈니스의 핵심 정책이나 규칙이 변경되지 않는 한 전체적인 구조가 한번에 흔들리지는 않는다.

 

임시로 책에 있는 몇 가지 내용을 적어봤습니다. 다시 정리할 예정입니다.


후기

 

 

 


출처

ko.wikipedia.org/wiki/SOLID_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%EC%84%A4%EA%B3%84)

 

SOLID (객체 지향 설계) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

- 이것이 자바다 신용권의 Java프로그래밍 정복

www.coupang.com/vp/products/2130711?isAddedCart=

 

이것이 자바다:신용권의 Java 프로그래밍 정복

COUPANG

www.coupang.com

- 객체지향의 사실과 오해

 

www.yes24.com/Product/Goods/18249021

 

객체지향의 사실과 오해

『객체지향의 사실과 오해』는 객체지향이란 무엇인가라는 원론적면서도 다소 위험한 질문에 답하기 위해 쓰여진 책이다. 안타깝게도 많은 사람들이 객체지향의 본질을 오해하고 있다. 가장

www.yes24.com

jeeneee.dev/java-live-study/week5-class/

 

[java-live-study] 5주차-클래스

클래스와 객체 클래스는 객체지향 프로그래밍(Object-oriented programming)에서 객체를 생성하기 위해 상태(state)와 행동(behavior)을 정의하는 일종의 설계도이다. 여기서 객체란 어플리케이션의 기능을

jeeneee.dev

velog.io/@youngerjesus/%EC%9E%90%EB%B0%94-%ED%81%B4%EB%9E%98%EC%8A%A4#1-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%A0%95%EC%9D%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

 

자바 클래스

자바의 클래스에 대해 정리합니다 > > 백기선님과 함께하는 자바 5주차 스터디 과정입니다. > > 학습할 내용은 다음과 같습니다. > > - 클래스 정의하는 방법 > - 객체 만드는 방법 (new 키워드 이해

velog.io