본문 바로가기

클래스17

이펙티브 자바 - Public 클래스의 Public 필드 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - 개요 public 클래스에서 멤버 변수를 public 으로 대외에 공개하지 말라는 규칙을 본적이 있을것이다. 이렇게 멤버 변수를 대외에 공개하면 많은 문제점들이 일어날 수 있다. 캡슐화의 이점을 누릴수가 없다. 내부표현을 변경하기 위해서 API 를 변경해야 한다. 불변식을 강제할 수 없다. 필드 사용시 그에 따른 동작을 수행할 수 없다. 해결법은 그리 어렵지 않은데 public 멤버 변수를 private 변수와 public 접근자 메서드로 변경하는것이다. - 공개해도 괜찮은 경우 private 변수와 public 접근자 메서드는 정설처럼 여겨져서 많은 사람들이 지키는 규칙이다. 그래서 코딩할 때 해당 변수는 외부에 공개되어도 되는 변.. 2021. 10. 26.
객체지향의 사실과 오해 - 개념, 명세, 구현 - 이 글은 조영호의 객체지향의 사실과 오해를 기반으로 작성되었습니다. (가능하면 꼭 읽어보는것을 추천드립니다.) - 개념, 명세, 구현 UML 관련 서적중 마틴 파울러의 UML Distilled 2판 에서는 객체 지향 설계를 개념 관점, 명세 관점, 구현 관점으로 구분한다. 우선 개념 관점은 도메인안에 존재하는 개념과 개념간의 관계를 나타낸것이다. 도메인은 앞에서 말했듯이 사용자가 관심을 가지는 분야를 의미한다. 이 관점에서는 실제 도메인의 규칙을 최대한 유사하게 반영하는것이 핵심이다. 명세 관점부터는 소프트웨어의 세계로 넘어온다. 명세 관점에서는 What/Who 사이클에서 What 에 해당하는 무엇에 초점을 맞추어서 객체의 인터페이스에 해당하는 관점에 집중한다. 구현 관점은 우리와 같은 프로그래머가 .. 2021. 8. 29.
객체지향의 사실과 오해 - 객체지향의 핵심 - 이 글은 조영호의 객체지향의 사실과 오해를 기반으로 작성되었습니다. (가능하면 꼭 읽어보는것을 추천드립니다.) - 객체지향의 핵심, 메시지 객체지향이라는 단어를 들으면 가장 먼저 생각나는것은 클래스이다. 프로그램을 구현하라고 하면 우리가 가장 먼저 하는 일은 클래스를 선언하고 속성과 메소드를 채워넣는것이다. 그리고 클래스간의 의존성을 관리하며 상속도 사용한다. 하지만 객체지향의 강력함은 객체들이 주고 받는 메시지에서 나온다. 따라서 객체들의 속성과 행위를 먼저 식별해야 한다. 클래스는 단지 객체들의 특성과 행위를 정적으로 표현하는 추상화 도구일뿐이다. 문제는 클래스보다 객체를 우선시한다고 해결되지 않는다는 것이다. 객체들의 속성과 행위를 먼저 식별해야 한다는 말을 개별적인 객체에 집중하라는 의도로 오.. 2021. 8. 18.
UML - 객체 다이어그램 - 이 글은 UML Distilled (마틴 파울러)책을 기반으로 작성하였습니다. - 객체 다이어그램 객체 다이어그램은 객체들의 특정 순간의 모습이다. 클래스가 아닌 인스턴스를 보여주므로, 인스턴스 다이어그램이라고도 한다. 위의 다이어그램에서 모임,사람,조직으로 이루어진 윗 부분은 클래스의 세트를 보여주고 있고, 아래는 객체의 연관 세트를 보여준다. 객체의 연관 세트에서 이름 아래에 밑줄이 쳐져있으므로 이는 인스턴스임을 나타낸다. 표기는 [인스턴스명 : 클래스명]의 형태를 갖는다. 인스턴스명과 클래스명은 둘 다 선택사항이므로 클래스명만 나타내도 상관없다. 다만 인스턴스명만 나타낼 경우 콜론을 생략해도 되지만 클래스명만 나타낼 경우 콜론을 생략하면 인스턴스명과 구분이 되지 않으므로 [:클래스명]으로 표시해.. 2021. 2. 10.
UML - 클래스 다이어그램 고급 - 템플릿 클래스 - 이 글은 UML Distilled (마틴 파울러)책을 기반으로 작성하였습니다. - 템플릿(매개변수) 클래스 정의 몇몇 언어는 매개변수 클래스(템플릿)라는 개념이 있다. Java에서 Set의 코드를 보면 아래와 같이 템플릿을 볼 수 있다. public interface Set extends Collection { 이렇게 정의된 템플릿 클래스는 아래와 같이 사용할 수 있다. Set employeeSet = new HashSet(); UML 에서도 이런 템플릿 매개변수를 지원한다. 템플릿 매개변수 T를 갖는 Set 을 UML로 표현하면 아래와 같다. Set 오른쪽 위에 점선 박스는 템플릿 매개변수를 나타낸것이다. 여러개를 선언할 수 있으며, 여기서는 매개변수 이름은 T 이고, 타입은 Class 임을 표시하.. 2021. 2. 10.
UML - 클래스 다이어그램 고급 - 연관 클래스 - 이 글은 UML Distilled (마틴 파울러)책을 기반으로 작성하였습니다. - 연관 클래스(Association class) 연관 클래스는 클래스간 연관 관계에 속성, 오퍼레이션 그리고 다른 기능들을 더해줄 수 있도록 해준다. 어떤 사람(Person)이 회의(Meeting)에 참석(Attendance)하는 다이어그램을 한번 살펴보자. Person과 Meeting 연관 관계에 Attendance 연관 클래스를 더했다. 또 연관 클래스에는 참석 여부를 가리키는 attentiveness 속성을 더했다. 사실 연관 클래스를 사용하지 않아도 우리는 이 관계를 표현할 수 있다. 연관 클래스가 아닌 완전한 클래스로 변환하여 위와 같은 다중성을 표시해주면 의미가 같아진다. 다중성을 변환한 부분이 좀 헷갈릴 수 .. 2021. 2. 10.
UML - 클래스 다이어그램 고급 - 클래스화와 일반화 - 이 글은 UML Distilled (마틴 파울러)책을 기반으로 작성하였습니다. - 클래스화(classification)와 일반화(generalization) 하위 타입을 판단할 때 "is-a 관계"를 사용하라고 말한다. 하지만 이 문장에는 함정이 있다. 아래 문장은 모두 "is-a" 로 표현할 수 있는 문장이다. 양치기 개는 콜리이다. (클래스화) 콜리는 개이다. (일반화) 개는 동물이다. (일반화) 콜리는 품종이다. (클래스화) 개는 종이다. (클래스화) 위의 문장들을 합쳐서 생각해보자. 1+2 문장을 합치면 "양치기 개는 개이다"가 된다. 2+3을 합치면 "콜리는 동물이다"가 되고, 1+2+3을 하면 "양치기 개는 동물이다"가 된다. 3 문장 모두 오류가 없다. 역시 하위 타입 판별에는 "is-a.. 2021. 2. 10.
UML - 클래스 다이어그램 고급 - 한정 연관 - 이 글은 UML Distilled (마틴 파울러)책을 기반으로 작성하였습니다. - 한정 연관(Qualified association) 한정 연관은 UML 에서 관계 배열, 맵, 해시, 딕셔너리로 표현할 수 있다. 위 다이어그램은 Order 클래스와 OrderLine 클래스 사이의 관계를 Product를 이용하여 한정자(Qualifier)를 표시한것이다. 여기서 Product 의 인스턴스는 각 하나의 OrderLine 만 존재한다는것을 표현한다. 한정 연관에서 다중성을 잘 해석해야 한다. OrderLIne 의 0..1 다중성은 Product에 대한 것이지 Order에 대한것이 아니다. Order 는 여러 개의 OrderLine 을 가질 수 있더라도 위의 다이어그램에서 다중성 상한 1(0..1)이 나타내.. 2021. 2. 10.
UML - 클래스 다이어그램 고급 - 참조 객체, 값 객체 - 이 글은 UML Distilled (마틴 파울러)책을 기반으로 작성하였습니다. - 참조 객체와 값 객체 보통 객체는 고유성을 가지고 있다. 이는 참조 객체에 대한 이야기이며, 값 객체에서는 해당사항이 없는 이야기이다. 참조 객체는 무엇이고 값 객체는 무엇인가? - 참조 객체(Reference Object) 참조 객체는 고객과 같은 객체이다. 만약 프로그램에서 고객을 참조한다면, 해당 고객의 참조는 유일하길 원할 것이다. 그래야만 해당 고객에 대한 정보가 변경될 때, 해당 고객을 사용(참조)하고 있던 여러 사용자들(여기서는 사람을 말하는것이 아니라 참조를 하는 다른 코드를 말한다.)에게 해당 정보가 반영될것이다. 만약 어떤 고객에 대한 참조가 여러개 있고 이런 참조들이 같은 고객을 참조하고있는지 확인하.. 2021. 2. 10.
UML - 클래스 다이어그램 고급 - 인터페이스 추상 클래스 - 이 글은 UML Distilled (마틴 파울러)책을 기반으로 작성하였습니다. - 인터페이스와 추상 클래스 추상 클래스는 직접 인스턴스화 될 수 없는 클래스이다. 추상 클래스는 추상 오퍼레이션을 가지고 있으며 추상 오퍼레이션은 구현을 갖고 있지 않다. UML 에서 추상 클래스 및 오퍼레이션을 표시할 때 글씨체가 기울어진 이탤릭체를 사용한다. 클래스는 인터페이스를 필요로하거나, 인터페이스의 기능을 제공한다. Order 클래스는 Line Item의 리스트를 필요로하며, List 인터페이스에 의존하고 있다. 인터페이스 기능을 제공하는 구현체는 AbstractList 추상 클래스를 상속하는 ArrayList 이다. 물론 Order가 사용시에는 ArrayList 구현체를 직접 사용하지 않고, List 인터페이.. 2021. 2. 10.