Effective Java - 객체 생성과 파괴 item02
·
Backend/Java
생성자에 매개변수가 많다면 빌더를 고려하라.정적 팩터리와 생성자에게 똑같은 제약이 하나 존재하는데, 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 점이다. 과거 프래그래머들은 점층적 생성자 패턴(telescoping constructor pattern)을 즐겨 사용했다고 한다. 이 클래스의 인스턴스를 만들려면 원하는 매개변수를 모두 포함한 생성자 중 가장 짧은 것을 골라 호출하면 된다. 점층적 생성자 패턴도 쓸 수는 있지만, 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다.  점층적 생성자 패턴public class Person { private final String name; private final int age; private final String addr..
Effective Java - 객체 생성과 파괴 item01
·
Backend/Java
정적 펙토리 메서드정적 팩토리 메서드는 객체 생성의 역할을 하는 클래스 메서드라고 생각하면 된다.  장점 1. 이름을 가질 수 있다. 즉, 생성 목적에 대한 이름 표현이 가능한 것이다. 단순히 생성자의 역할을 대신 이행하는 것 뿐만 아니라 개발자가 좀 더 가독성 좋은 코드를 작성하고 객체 지향적으로 프로그래밍할 수 있게 도와준다.지금까지 클래스를 설계할 때 다양한 타입의 객체를 생성하기 위해 생성 목적에 따라 생성자를 오버로딩하여 구분하여 사용해왔다. 하지만, new 키워드를 사용하려면 개발자는 해당 생성자의 인자 순서와 내부 구조를 알고 있어야 목적에 맞게 객체를 생성할 수가 있다는 번거로움이 있다. 따라서 정적 메서드를 통해 적절한 메서드 네이밍을 해준다면 반환될 객체의 특성을 한번에 유추할 수 있고..
[Java] Java Application이 32bit 또는 64bit JVM에서 실행 중인지 여부 판별하기
·
Backend/Java
Java에 대해서 천천히 공부 중이다. 알고리즘 문제를 풀기 위해서, 개발을 위해서, 학교 수업을 위해서 어떤 문법으로 어떤 기능을 개발할 것이냐에 초점을 두고 공부해왔다. JVM이 어떻게 돌아가는 지, Java API가 제공하는 기능들이 무엇인지도 모르면서...!  하나씩 차근차근 이해하고 공부하자.  public class Main { public static void main(String[] args) { // We can use the “sun.arch.data.model” system property to identify JVM bitness: String jvmBit = System.getProperty("sun.arch.data.model"); if..
Comparable과 CompareTo
·
Backend/Java
CompareTo() compareTo() 함수는 두개의 값을 비교하여 int 값으로 반환해주는 함수이다. compareTo() 함수에는 “문자열의 비교”와 “숫자의 비교” 두 방식이 존재한다. 숫자의 비교 : 크다(1), 같다(0), 작다(-1)의 결과값을 리턴 문자열 비교 : 같다(0), 그 외 양수/음수값 같이 참 재미난 결과 리턴 비교대상에 문자열이 포함되어 있을 경우 1. 기준값에 비교대상이 포함되어 있을 경우 서로의 문자열 길이의 차이값을 리턴해준다. 예를 보면, “ab”(2) - “a”(1) = 1 “ab”(2) - “ab”(2) = 0 “”(0) - “ab”(2) = -2 “ab”(2) - “”(0) = 2 public class Test { public static void main(St..
SOLID 5가지 원칙
·
Backend/Java
SRP 단일 책임 원칙(Single responsibility principle) 하나의 클래스는 하나의 책임만 가져야 한다. 하나의 책임은 모호하다. 클 수도 있고, 작을 수도 있으며, 문맥과 상황에 따라 다르다. 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것 UI 변경, 객체의 생성과 사용을 분리 OCP 개방-폐쇄 원칙(Open/closed principle) 소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀 있어야 한다. 다형성을 활용해보기 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현 지금까지 배운 역할과 구현의 분리를 생각해보기 문제점 MemberService 클라이언트가 구현 클래스를 직접 선택 MemberRepository..
자바 컬렉션 프레임워크 - Java Collections Framework
·
Backend/Java
자료구조의 분류대표적으로 선형 자료구조와 비선형 자료구조 나눌 수 있는데 이러한 분류를 보통 형태에 따른 자료구조라고 보며, 각 자료구조에 알맞게 구체화된 것들을 구현된 자료구조라고 한다. 선형 자료구조(Linear Data Structure): 리스트(List), 큐(Queue), 덱(Deque) 비선형 자료구조(NonLinear Data Structure): 그래프(Graph), 트리(Tree) 집합 자료구조: 집합(Set) Java Collection Framework일정 타입의 데이터이 모여 쉽게 가공할 수 있도록 지원하는 자료구조의 뼈대(기본 구조)라는 의미 자바에서 제공하는 Collection은 크게 3가지 인터페이스로 나뉜다. (List, Queue, Set)앞서 설명한 형태에 따른 자료구조..
제네릭(Generic) - 1
·
Backend/Java
제네릭 - 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것 - 한마디로 특정(specific) 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입이라는 것 - JDK 1.5 이전에서는 여러 타입을 사용하는 대부분의 클래스나 메서드에서 인수나 반환값으로 Object를 사용하였다. 하지만 이 경우에는 반환된 Object 객체를 다시 원하는 타입으로 변환해야 하며, 이때 오류가 발생할 가능성도 존재한다. JDK 1.5부터 도입된 제네릭을 사용하면 컴파일 시 미리 타입이 정해지므로, 타입 검사나 타입 변환과 같은 번거로운 과정을 생략할 수 있게 된다. 제네릭의 제거 시기 - 자바 코드에서 선언되고 사용된 제네릭 타입은 컴파일 시 컴파일러에 의해..
JDK, JRE 그리고 JVM
·
Backend/Java
JDK Java Development kit JDK = JRE + 개발을 위한 도구 컴파일러, 디버그 도구 등이 포함 JRE Java Runtime Environment JRE = JVM + 자바 프로그램 실행에 필요한 라이브러리 파일 등 JVM의 실행환경 구현 JVM : 자바 프로그램을 구동해주는 프로세서(엔진) OS마다 다른 컴파일러가 필요하지만 JAVA는 JVM이 똑같은 바이트 코드를 OS마다 다르게 번역해준다. (⇒ 해당 OS가 이해할 수 있도록 번역해준다) 그렇기 때문에 플랫폼에 독립적인 개발이 가능하다. 동작 과정 자바 실행 파일을 실행하면 JVM은 OS로부터 메모리를 할당한다. .java(자바 소스코드)를 컴파일러가 .class(바이트 코드)로 컴파일해준다. 컴파일된 바이트 코드는 Java ..
형변환 정리
·
Backend/Java
int -> char int -> String // Integet to Character int i = 65; char ch = (char)i; // 'A' // Integer to String String s = String.valueOf(i); // 'A' char -> int char -> String // Character to Integer // 숫자를 넘기는 경우, - '0'을 해줘야한다. (아스키 코드값을 넘겨주기 때문이다.) char ch = '8'; int i = (int)ch - '0'; // 일반 char를 넘기는 경우 char ch = 'A'; int i = (int)ch; // 65 // Character to String (char, char[] 둘 다 사용가능하다.) char ..
String과 Character 그리고 equals()함수 (+ generic)
·
Backend/Java
제네릭(Generic) 절묘하게 맞춰진 미완성 그림이다. 제네릭을 활용하면 박싱/언박싱 등을 고려하지 않고, 그래도 갖다쓸 수 있다. 타입에 따라 클래스를 여러 번 만들거나 반복적인 수동 형변환을 해주지 않아도 되서 편리한 듯 하다. 자바는 배우면 배울수록 매력있는 언어인 듯 하다. (자바똥) public class Main { public static void main(String[] args) { 제너릭저장소 a저장소 = new 제너릭저장소(); a저장소.setData(500); System.out.println(a저장소.getData()); } } class 제너릭저장소{ private Object data; public T getData() { return (T)this.data; } public..
인터페이스와 예외처리
·
Backend/Java
인터페이스(Interface) 추상 메서드와 상수만을 포함하고 있으며, 다중 상속을 지원하기 위함 (단, 모든 추상 메서드를 구현하지 않는다면 추상클래스로 선언할 것!!!) 접근제어자 interface 인터페이스이름 { public static final 타입 상수이름 = 값; public abstract 메서드이름(매개변수...) { } } 장점 1. 대규모 프로젝트 개발 시 일관되고 정형화된 개발을 위한 표준화 가능 2. 클래스의 작성과 인터페이스의 구현을 동시에 진행 가능, 개발 시간 단축 3. 클래스와 클래스간의 관계를 인터페이스로 연결하면, 클래스마다 독립적인 프로그래밍 가능 package Java.JavaInterface; interface Animal { public abstract void..
다형성과 super(), instanceof()
·
Backend/Java
다형성(Polymorphism) 클래스는 상속을 통해 확장될 수 있어도 축소될수는 없으므로, 자식 클래스에서 사용할 수 있는 멤버의 개수가 언제나 부모 클래스와 같거나 많게 된다. 참조 변수의 타입 변환 1. 서로 상속관계에 있는 클래스 사이에서만 타입 변환 가능 2. 자식 -> 부모 클래스 타입으로의 타입 변환은 생략 가능 3. 부모 -> 자식 클래스 타입으로의 타입 변환은 반드시 타입 변환 명시해야 함 Child child = (Child)new Parent(); Super() this() 메서드가 같은 클래스의 다른 생성자를 호출할 때 사용된다면 super() 메서드는 부모 클래스의 생성자를 호출할 때 사용된다. child 클래스에 지역 변수로 a가 선언되지 않으면 10, 10, 10 이 출력된다...