Programming Languages(47)
-
[Java] 메서드 시그니처
자바에서 메서드 이름과 파라미터를 합쳐서 메서드 시그니처라고 한다. 메서드 이름이 다르거나 파라미터 타입, 개수가 다르면 시그니처가 다르다고 표현한다. 리턴 타입이나 예외 타입은 시그니처에 포함되지 않는다. 비교 대상 메서드 public String greeting(String name) throws Exception { return "hello " + name; } 비교 메서드 // 메서드 시그니처가 다르다 public String hello(String name) { return "hello " + name; } // 메서드 시그니처가 다르다 public String greeting(String name, String suffix) { return "hello " + name + suffix; } /..
2021.12.04 -
[Effective Java] item 18. 상속보다는 컴포지션을 사용하라
상속은 코드를 재사용하는 강력한 수단이지만 잘못 사용하면 오류를 만들어내기 쉬운 소프트웨어가 된다. 슈퍼 클래스와 서브 클래스가 같은 프로그래머에 의해 다루어지며 통제하는 경우는 안전하다. 확장할 목적으로 잘 설계되었고 문서화도 잘 된 클래스 또한 안전하다. 그러나 외부 패키지에서 이를 상속하는 경우 문제가 발생한다. 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. 다르게 말하면 슈퍼 클래스가 어떻게 구현되었느냐에 따라 서브 클래스의 동작에 문제가 생길 수 있다. 슈퍼 클래스는 버전마다 내부 구현이 달라질 수 있다. 이때문에 확장을 충분히 고려하여 설계하지 않거나 문서화가 부족한 경우 이를 상속하는 서브 클래스들은 이에 발맞춰서 코드를 수정해야 하는 불상사가 생긴다. 구체적인 예제를 살펴보자. HashSe..
2021.11.26 -
[Effective Java] item 2. 빌더 패턴을 고려하라
문제 일반적인 자바빈 규약을 준수한 객체를 생성하려고 하면 코드가 장황해지고 메서드를 여러 개 호출해야 한다. 다음과 같은 객체가 그러하다. public class Room { private int roomNo; private Sofa sofa; private TV tv; private Bed bed; public Room() {} // 게터 및 세터 } 위와 같은 경우 빈 객체를 생성하고 세터 메서드로 모두 값을 지정해주어야 한다. 이렇게 객체를 구성하면 세터로 모든 멤버 변수를 지정해주기 전까지 일관성이 무너진 상태가 된다. 또한 매개변수들이 전부 유효한지 생성자를 통해 확인했는데 세터로 값을 주입받기 시작하므로 안정성 또한 무너졌다. 이러한 문제점 때문에 버그가 발생할 확률이 증가하고 디버깅 및 유..
2021.11.19 -
[Java] Equals and HashCode
equals()와 hashcode()는 서로 다른 객체가 같은지를 판별할 때 사용되는 메서드이다. Object 클래스에 구현되어 있고 따라서 모든 객체가 상속받는다. Object의 equals()는 객체의 참조값을 비교하기 때문에 비교하고자 하는 클래스에서 hashCode()와 함께 오버라이딩해야 한다. hashCode()는 객체의 멤버 변수를 통해 해싱을 통한 해시값을 만들어낸다. 따라서 멤버 변수가 달라지면 hashCode()의 결과도 달라진다. 참고로 Object의 hashCode()는 객체의 주소값으로 해시코드를 만들어내기 때문에 프로그램을 실행할 때마다 변경될 수 있다. JDK1.8부터 java.util.Objects 클래스에 hash() 메서드가 추가됐다. hashCode()를 구현할 때 유용..
2021.10.19 -
[Java] Thread
Thread란? 쓰레드를 알아보기 전에 프로세스에 대해 먼저 이해하도록 하자. 프로세스(Process)는 간단하게 말하면 실행 중인 프로그램이다. 프로그램은 일반적으로 하드 디스크, SSD 등의 저장 장치에 저장되어 있다. 이 프로그램을 실행 시켜 사용하려면 우리는 보통 exe와 같은 실행 파일을 시작시킨다. 그러면 OS로부터 실행에 필요한 자원(메모리)을 할당받아 메모리에 프로그램이 적재되고 우리가 프로그램을 사용할 수 있게 된다. 프로세스는 프로그램을 실행하는데 필요한 데이터, 메모리 공간, 기타 자원과 쓰레드로 구성되어 있다. 그리고 프로세스의 자원을 사용해서 실제로 작업을 수행하는 것이 쓰레드이다. 쓰레드는 한 프로세스에 여러 개가 존재할 수 있다. 한 프로세스에서 여러 쓰레드를 사용하는 프로세스..
2021.10.19 -
[JavaScript] Promise Static Method
프로미스는 5가지 정적 메서드를 제공합니다. Promise.resolve / Promise.reject 이미 존재하는 값을 프로미스 객체로 래핑하는 메서드입니다. const resolved = Promise.resolved(resolve => resolve([1, 2, 3]); resolved.then(console.log); // [1, 2, 3] const rejected = Promise.rejected(new Error("에러 발생")); rejected.catch(console.log); // "에러 발생!" Promise.all 여러 프로미스들을 병렬적으로 처리할 때 사용하는 메서드입니다. const req1 = () => new Promise((resolve) => setTimeout(() ..
2021.05.12