OOP/OOP Basic 8

[OOP] 피터 코드의 상속 규칙

객체지향 소프트웨어 개발의 대가 피터 코드(Peter Coad) 피터 코드는 상속의 오용을 막기 위해 5가지 상속 규칙을 내세웠다. 1. 자식클래스와 부모클래스는 '역할 수행' 관계가 아니어야 한다. 상속은 '추상화'를 구현한다. 추상화란 '공통된 특징'을 파악해 '인식의 대상'으로 삼는 행위이다. 달달하고 상큼한 것을 먹고 싶을 때, 우리는 '과일' 먹고 싶다라고 말한다. 바나나, 딸기, 수박, 파인애플 등등 '과일'이라는 단어가 없다면 무척이나 표현이 힘들어진다. 그러므로 추상화란 어떤 집단이나 집합의 '간판'과 같다. 그리고 객체지향설계에서 추상화는 상속으로 구현된다. 그런데 가끔 상속을 역할과 혼동하는 경우가 생긴다. 민수는 출근하면 회사원이다. 퇴근하면 운전자가 된다. 주말에는 아르바이트생이 된..

OOP/OOP Basic 2022.10.18

[OOP] 특수화

[OOP] 일반화(추상화) 일반화(추상화)는 객체지향 설계의 핵심이다. 일반화와 추상화는 사전적 정의로 구분될 수 있지만 굳이 구분 안 해도 별 탈 없다. 추상화와 일반화를 구분하는 것보다 더 중요한 것이 있다. 바로 lordofkangs.tistory.com 지난 포스팅에서는 일반화를 다루었다. 회원(MEMBER)는 VIP 회원과 일반 회원(Ordinary)의 일반화이다. VIP 클래스나 ORDINARY 클래스의 공통된 데이터에 대한 로직은 MEMBER 클래스에 접근하는 것이 좋다. 반면 VIP 할인과 같이, VIP만 해당되는 영역은 VIP만 따로 접근하는 것이 좋다. 여기서 요구사항이 추가되었다고 가정해보자. 지역(Local) 주민들은 기프티콘을 받는다. VIP이면서 지역주민일 수 있고 일반 회원이면..

OOP/OOP Basic 2022.10.18

[OOP] 일반화(추상화)

일반화(추상화)는 객체지향 설계의 핵심이다. 일반화와 추상화는 사전적 정의로 구분될 수 있지만 굳이 구분 안 해도 별 탈 없다. 추상화와 일반화를 구분하는 것보다 더 중요한 것이 있다. 바로, 일반화와 특수화를 구분하는 것이다. 일반화(추상화)는 공통된 특성이나 공통된 기능으로 묶는 것을 의미한다. 공통된 특성은 상속으로 구현되고 공통된 기능은 인터페이스로 구현된다. 어떤 관점을 가지냐에 따라 설계 방식이 달라진다. 사용자는 '키는' 기능을 하고 싶다. 근데 만약 전등에 직접 접근한다면 오로지 전등만 킬 수 있다. TV, 에어컨 기타 등등은 킬 수 없다. 이는 비효율적인 설계이고 유지보수에 좋지 못하다. 효율적인 설계를 하려면 사용자는 '키는' 기능에 접근해야한다. 예를 들어 리모컨이 있을 수 있다. p..

OOP/OOP Basic 2022.10.17

[OOP] 캡슐화

캡슐화(Encapsulation) 캡슐화는 요구사항 변경을 유연하게 만든다. 그 이유는 높은 응집도와 낮은 결합도를 구현하기 때문이다. 응집도는 모듈 내부의 구성요소가 얼마나 통일성 있는지를 나타낸다. 모듈 내부의 변수나 메소드가 서로 다른 목적과 역할을 가진다면 모듈의 응집도는 떨어지고 여러 요소에 영향을 많이 받는다. 즉 유지보수가 어려워진다. 1) 응집도 public class Computer{ private Mainboard mb; private CPU cpu; private Memory memory; private Phone phone; // 아무 관련 없는 객체 public Computer(){ this.mb = new MainBoard(); this.cpu = new CPU(); this.m..

OOP/OOP Basic 2022.10.17

[OOP] 의존관계

객체는 크게 두 가지로 구성된다. 1. 필드변수 2. 메소드 필드변수는 Heap Memory에 저장되므로, 객체가 가비지 컬렉터에 의해 제거 될 때까지 살아있다. 고로, 항시적 데이터는 필드변수에 저장한다. 이전 포스팅에서 다룬 연관관계, 집합관계, 합성관계는 다른 객체의 주소를 필드변수에 저장하는 관계로 언제든 참조 가능한 관계이다. 반면, 메소드에서 생성된 변수는 Stack Memory에 저장되므로, 메소드 호출기간 동안만 살아있다. 메소드 같이, 특정 기능을 수행할 때만 필요한 객체는 임시로 메소드 내 변수에 저장하는데, 이를 의존관계라 부른다. 의존관계는 두 가지 유형이 있다. 1. 객체를 메소드 인수로 받는 경우 public class Car{ public void fillGas(GasPump ..

OOP/OOP Basic 2022.10.12

[OOP] 합성관계와 집합관계

합성관계(Compostion)와 집합관계(Aggregation)는 전체와 부분을 나타내는 관계로 부분객체의 생성권한이 어디있느냐로 구분된다. 합성관계(Composition) 전체객체가 부분객체의 제어권을 갖는다. 예를 들면, 일체형 컴퓨터 같은거다. public class Computer{ private MainBoard mb; private CPU cpu; private Memory memory; public Computer(){ this.mb = new MainBoard(); //객체생성 this.cpu = new CPU(); // 객체생성 this.memory = new Memory(); //객체생성 } } Computer 객체가 생성될 때, MainBoard,CPU,Memory 객체도 생성된다. ..

OOP/OOP Basic 2022.10.12

[OOP] 연관관계(2) - Vector의 사용

[OOP] 연관관계 (1) 객체지향설계의 기본은 객체 간 '참조'이다. 객체지향 프로그램은 객체 간 상호작용으로 특정 '기능'을 구현한다. 상호작용을 하려면 서로의 위치를 알아야한다. 즉 '주소'를 알아야한다. 그래 lordofkangs.tistory.com 지난 포스팅에서 연관관계란 무엇인지 알아보았다. 이번 포스팅에서는 단방향 연관관계에 대해서 알아보겠다. 단방향 연관관계 객체는 다른 접근의 데이터(필드)나 기능(메소드)이 필요하여 접근한다. 객체A는 객체B의 주소를 알고 객체B는 객체A의 주소를 모르는 관계, 이를 '단방향 연관관계'라 부른다. 위 그림의 객체A와 객체B 처럼 서로 주소를 알고 있는 관계를 양방향 관계라 부른다. 두 객체가 서로 참조한다면 두 객체를 엮는 공통의 목적이 존재한다. 예..

OOP/OOP Basic 2022.01.30

[OOP] 연관관계 (1)

객체지향설계의 기본은 객체 간 '참조'이다. 객체지향 프로그램은 객체 간 상호작용으로 특정 '기능'을 구현한다. 상호작용을 하려면 서로의 위치를 알아야한다. 즉 '주소'를 알아야한다. 그래야 원하는 객체에 접근이 가능하다. 연관관계 와 의존관계 주소가 저장되려면 '공간'이 필요하다. 우리는 이를 '참조변수'라 부른다. 참조변수는 메모리에 생성되는데, Stack 메모리에 생성되는 참조변수 Heap 메모리에 생성되는 참조변수 두 가지가 있다. 객체는 크게 두 부분으로 나뉜다. 1. 필드 2. 메소드 필드는 객체 생성시, Heap 메모리에 저장된다. 메소드는 메소드 호출시, Stack 메모리에 저장된다. 필드의 참조변수는 가비지 컬렉터가 객체를 제거하지 않는 이상, 영속적으로 존재한다. 반면 메소드 내의 참조..

OOP/OOP Basic 2022.01.29