Java Virtual Machine JVM이란 Java 애플리케이션을 클래스 로더를 통해 읽어 들여 Java API와 함께 실행하는 것을 말한다. JVM은 Java와 OS 사이에서 중개자 역할을 하며 Java가 OS에 구애받지 않고 재사용을 가능하게끔 해준다. JVM은 스택기반의 가상머신으로 메모리 관리와 Garbage Collection을 수행한다. 우리는 왜 JVM을 알아야 할까? 메모리는 한정되어 있고 우리는 이 한정된 메모리에 안에서 프로그램을 실행해야하니 메모리를 최대한 효율적으로 사용해야 하는 것이다. 메모리를 효율적으로 사용하기 위해서는 메모리 구조를 알고 메모리 관리가 어떤 식으로 되는 진행되는 지 파악하여 그 입맛에 맞게 개발을 해야한다. JAVA 프로그램의 실행 과정을 살펴보자 우리가..
배열과 리스트의 관계 ArrayList ArrayList는 자료구조의 한 종류로서 동적으로 배열의 크기를 변경할 수 있다. 그럼 ArrayList는 어떻게 배열의 크기를 조정하는 것일까? ArrayList의 초기 크기는 10이다. add()로 인해 사이즈가 꽉 찼을 시 현재의 1.5배를 증가시켜 새로운 배열을 생성한다. 1.5배 증가시킨 새로운 배열에 현재의 배열을 copy한다. 만약 배열의 추가 및 삭제가 반복적으로 일어나게 된다면, 기존 배열에 있는 데이터들은 공간을 매꾸기 위해서 이동해야한다. 즉, 성능적인 이슈가 발생할 수 있다는 것이다. 이 때는, ArrayList 보다는 LinkedList로 배열을 생성하는 것이 더 적합할 수 있다. LinkedList LinkedList는각 인스턴스들이 다음..
String 사용? 미사용? String은 메모리에 어떻게 저장되는가? 객체의 값은 변경가능 한가? String 객체 대부분은 원시(Primitive) 타입으로 취급하므로 new 키워드를 사용할 필요가 없다. new 키워드를 사용 안 하고 String 리터럴로 표현할 경우 String Constant Pool 영역(힙 영역이 감싸고 있음)에 존재한 후 해당 영역의 값을 가리키게 된다. new 키워드를 사용할 경우에는 heap영역에 String 객체를 생성하게 되는 것이다. Java에서 String은 특별한 참조 자료형이다. 다른 객체들과 마찬가지로 new 생성자를 이용해서 인스턴스를 만들고 heap영역에 올라가지만, 다른 참조형과는 다르게 한번 객체가 생성되면 해당 값은 변하지가 않는다. String s..
추상클래스와 인터페이스 추상 메소드의 구현 강제성 추상 클래스 추상 클래스는 클래스 내에 추상 메소드가 하나 이상 포함거나 abstract로 정의된 경우를 말한다. 인터페이스 인터페이스는 모든 메소드가 추상 메소드인 경우를 말한다. 추상 클래스와 인터페이스는 상속받는 하위 클래스 혹은 구현 클래스에서 추상 메소드를 구현하도록 강제한다 추상클래스와 인터페이스 목적 그렇다면 의문이 들 수 있다. 인터페이스는 왜 필요하지? 그냥 추상 클래스로 인터페이스 역할까지 하면 되는거 아닌가? 둘은 존재 목적이 다르다. 추상클래스는 해당 추상 클래스를 상속받아서 확장하기 위해 존재하는 것이다. 추상 클래스는 단일 상속만 받아서 확장을 하고자 하는 것이다. 인터페이스는 구현한 객체들이 동일한 동작을 약속하기 위해 존재하는..
접근제한자 접근 제한자는 클래스 내에서 멤버의 접근을 제한하는 역할을 한다. 접근 제한자의 종류 public 모든 클래스에서 접근이 가능하다. protected 같은 패키지내에서만 접근이 가능하다. 서로 다른 패키지라도 상속받은 하위 클래스에서는 접근이 가능하다. private 자기 자신만이(자기 클래스) 접근이 가능하다. default(접근 제한자 적지 않으면) 같은 패키지내에서만 접근이 가능하다(protected와 비슷) 정보은닉과 접근제한자 참고 https://it-mesung.tistory.com/41?category=813111 [Effective Java] 아이템 15. 클래스와 멤버의 접근 권한을 최소화하라 it-mesung.tistory.com
상속(Inheritance)과 구성(Composition) 상속을 사용하는 이유 공통적인 부분을 가지고 있는 상위 클래스를 활용하여 하위 클래스는 본인 고유의 상태와 행동을 정의하기 위함이다. 코드의 확장성, 재사용성이 용이하고 중복된 코드를 상위 클래스로 뺐으므로 코드가 간결해진다. 결과적으로, 유지보수가 쉬워진다는 점이다. 상속 정의 하위 클래스는 상위 클래스의 모든 메소드를 재사용할 수 있고, 재정의를 하여 하위 클래스만의 메소드로 변경할 수도 있다. public class Car{ public void print() { System.out.println("부릉부릉"); } } public class Tico extends Car{ @Override public void print() { Syste..
오버로딩 왜 오버로딩을 사용하는가? 객체가 커지면 커질수록 메소드의 개수는 많아진다. 이 때, 근본적으로는 같은 기능을 하지만 이름 짓기가 애매하고 사용하는 쪽도 메소드만 보고 확실한 개념을 잡기에 어려워 오버로딩을 사용한다. 객체적으로 접근해봤을 때는, 사용하려는 객체의 메소드만 알고 있으면 해당 메소드(오버로딩 메소드)는 여러 파라미터를 가지고 있어 객체간의 메시지 전송이 원활하다. 흔히 알고 있는 오버로딩 오버로딩 조건 메소드 이름은 같아야 한다. 파라미터 개수나 타입이 달라야 한다. return 타입은 상관이 없다. //생성자 오버로딩 public class BasicOverLoading { String brandName; int since; public BasicOverLoading(int si..
enum 열거형이라고 칭하고, JDK5부터 추가되었다. JDK5 전에는 상수를 활용하여 열거형의 개념을 표현했다. public class EnumStudy { public static final String MALE = "MALE"; public static final String FEMALE = "FEMALE"; public static void main(String[] args) { String gender; gender = EnumStudy.MALE; gender = EnumStudy.FEMALE; } } 상수를 사용했을 때 문제가 발생한다는 것을 찾을 수 있었다 gender라는 String 변수는 처음 "MALE"이라는 변수로 고정되기를 원하는데, 다음 라인에서 "FEMALE"로 변경되는 것을 볼..
- Total
- Today
- Yesterday
- flatMap
- try catch finally
- 김영한
- 이펙티브 자바
- 생성자
- Effective Java
- 이펙티브자바
- 스프링부트
- 팩토리 메소드 패턴
- 자바8
- jdk버전
- effectivejava
- package-private
- 빌더 패턴
- 연관관계
- springboot
- 점층적 생성 패턴
- try with resources
- @Lazy
- 빈 순환 참조
- ifPresent
- junit
- 정적팩터리메서드
- mustache
- 인프런
- java
- 복사 팩토리
- JPA
- Spring
- java8
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |