java 7

Socket을 활용한 채팅 네트워크 프로그램 객체지향을 곁들인...

이번 포스팅은 소켓을 직접활용해서 어떻게 클라이언트와 서버간의 연결을 통해 채팅 프로그램을 구현할 것이다이번 프로그램은 단순히 잘 동작만 하는것이 아닌책임, 역활, 협력의 관점으로 바라보며 코드를 작성하겠다.사용자들이 채팅을 하기 위해서 어떤 객체가 필요한지각 객체들이 어떤역활을 수행해야하는지 어떤 역활을 맡아야 하고 어떤 데이터를 책임져야하는지에 대해자세히 서술하고자 한다.이번 포스팅의 목적은 소캣프로그래밍에 대해 이해도를 높이고 또한 객체지향적인 시점을 얻기 위해 작성되었다.채팅 프로그램 설계서버에 접속한 사용자들은 모두 대화할 수 있어야한다.입장 /join | {name}처음 채팅 서버에 접속할 때 사용자의 이름을 입력해야합니다.이름 변경 /change | {name}사용자의 이름을 변경한다.전체 ..

Java 2025.03.16

[ITEM 18] 상속보다는 컴포지션을 사용하라

컴포지션은 합성을 뜻한다.  상속은 코드를 재사용하는 강력한 수단이지만 항상 최선은 아니다 잘못 사용하면 오히려 오류를 내기 쉬운 소프트웨어를 만들게 된다 확장을 할 목적으로 설계하였고 문서도 잘 정리가 되어있으면 괜찮다 하지만 구체 클래스를 패키지를 경계를 넘어, 즉 다른 구체 클래스를 상속 받는것은 위험하다.  상속은 캡슐화를 깨뜨린다 다르게 말하면 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스 동작에 이상이 생긴다. 바로 코드 예를 보자면 직접 HashSet을 상속 받은 코드 import java.util.Collection;import java.util.HashSet;import java.util.Set;public class InstrumentedHashSet extends HashSet ..

[ITEM 17] 변경 가능성을 최소화 하라

이번 이팩티브 자바에서 소개하는 챕처는 꽤나 긴편이다중복된 이야기가 자주 나오지만 그 이유는 중요하기 때문에 반복하고 강조하는것이다 해당 챕터를 읽고 내가 생각하는 조슈아 블로크가 독자들에게 전달하고 싶은 키워드는 바로 캡슐화이다.캡슐화는 모든 소프트웨어의 기본 근간이 되는 아주 중요한 개념이다 캡슐화를 통해 많은 장점을 가질 수 있다.  객체의 변경 가능성을 최소화 하면 코드의 변경이 유연하고 쉬워진다이렇게 들으면 뭔가 논리적으로 안맞는것 같지만 사실이다캡슐화를 통해 얻을 수 있는 가장 큰 장점 중 하나는 객체들간의 결합도를 낮출 수 있다.  책 OBJECT의 저자 조영호는 기능을 수정하는데 클래스 하나 이상 수정을 해야한다면 그건 결합도가 높다고 말하기도 했다. 결합도는 한 모듈이 변경되기 위해서 다..

[ITEM 16] public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

간혹 단순히 여러 값을 담은 인스턴스가 필요한 객체를 생성할 때 이렇게 작성하는 경우가 있다.public class PointV1 { public double x; public double y;} 나의 경우에는 코딩테스트 코드 작성할때 getter, setter 메서드로 호출하는것이 너무 귀찮아서 이렇게 한적은 있지만실제로 어플리케이션 개발 때는 절대 사용하지 않는 클래스 설계다.. 이 코드의 문제점은 다음과 같다생성자를 통해 값을 셋팅하지 않아 필수값을 누락할 수 있다생성자를 통해 값을 셋팅하지 않아 x,y의 불변식이 무너질 수 있다.외부 공개 클래스인데 내부 상태를 완전히 노출되어 언제 객체가 이상하게 작동해도 이상할 점이 없다캡슐화의 이점을 얻을 수 없다. (객체의 자율성을 보장하지 못한..

[ITEM 15] 클래스와 멤버의 접근 권한을 최소화 하라

잘 설계된 컴포넌트와 어설프게 설계된 컴포넌트의 차이는 내부 구현 정보를 외부로 부터 얼마나 잘 숨겼느냐다정보은닉, 혹은 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리다.  기본원칙은 간단하다 모든 클래스와 멤버의 접근성을 가능한 좁혀야 한다.  자바의 접근제한자는 다음과 같다public : 모든 곳에서 접근 가능protected : 같은 패키지에서는 자유롭게 접근 가능 | 다른 패키지에 있는 경우에는 하위 클래스(상속 관계)에서만 접근 가능.package-private :같은 패키지 내에서만 접근 가능, 다른 패키지에서는 접근 불가능.private : 해당 클래스에서만 접근 가능멤버 접근성을 좁히지 못하게 방해하는 제약 한가지 있다. 상위 클래스의 메서드를 재정의할 때는 그 접근 수준을..

Thread 중단 및 종료

작업이나 스레드를 안전하고 빠르고 안정적으로 멈추게 하는 일은 어려운 일이다..자바에서는 스레드를 멈추게 하는 방법이 없다. 대신 interrupt라는 방법을 사용할 수 있다.  작업 중단 시나리오1. 사용자가 취소하기를 요청한 경우  : 사용자가 중간에 취소 버튼을 눌러 취소를 요청한 경우2. 시간이 제한된 작업 : 일정한 시간 내 답이 될만한 결과를 계속 찾다 제한된 시간이 지나면 나온 결과중 가장 최적의 해에 가까운 값을 반환 하고 나머지 는 작업을 취소하는 경우3. 애플리케이션 이벤트 : 원하는 결과를 얻기 위해 다양한 조건을 지정해 여러 작업을 동시에 실행시킨다. 특정 작업 결과를 얻었다면 나머지는 작업은 모두 취소하는 경우4. 오류 : 예상치 못한 오류로 진행 중이던 작업을 취소하고 현재 진행..

Java 리플랙션<Reflection>

# 1  리플렉션이란 자바 클래스가 제공하는 다양한 정보를 동적으로 분석하고 사용하는 기능을 리플렉션이라 합니다.리플렉션을 통해 프로그램 실행 중에 클래스, 메소드, 필드 등에 대한 정보를 얻거나, 새로운 객체를 생성하고 메서드를 호출하며, 필드의 값을 읽고 쓸 수 있습니다. 리플렉션을 통해 얻을 수 있는 정보는 다음과 같습니다. 클래스의 메타데이터 : 클래스 이름, 접근 제어자, 부모 클래스, 구현된 인터페이스등필드 정보 : 필드의 이름, 타입, 접근 제어자를 확인하고, 해당 필드의 값을 읽거나 수정할 수 있다.메서드 정보 : 메서드 이름, 반환 타입, 매개변수 정보를 확인하고, 실행 중에 동적으로 메서드를 호출 할 수 있다. 생성자 정보 : 생성자의 매개변수 타입과 개수를 확인하고, 동적으로 객체를 ..

Java 2025.02.21