일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- NestJS 요청흐름
- CORS
- cross-cutting concerns
- #@Transacional
- type eraser
- 단어변환
- CQS
- 역정규화
- wrapper class
- generic type
- assertJ
- API
- pessimistic lock
- Java
- IllegalStateException
- Generic method
- RequestMappingHandlerMapping
- SPOF
- demand paging
- TDZ
- COPYOFRANGE
- 벌크연산
- ExceptionResolver
- propagation
- Transaction
- HandlerMethod
- 프로그래머스
- tracking-modes
- optimistic lock
- hoisting
- Today
- Total
목록Language/Java (58)
jingyulog
추상 클래스는 그 자체로 인스턴스가 될 수 없으며, 상속받는 자손이 인스턴스가 된다. 그리고 abstract 키워드를 사용하여 클래스를 정의한다. 추상 클래스는 보통 1개 이상의 추상 메서드를 가지지만, 없다해도 오류가 발생하진 않는다. 추상 메서드 다음의 Car2 클래스를 만든 사람이 run()이라는 메서드가 필요하다라고 생각을 하고, run()은 자동차마다 다르게 구현할 것 같다고 생각이 들면 추상메서드를 만들게 된다. public abstract class Car2 { public Car2(String name) { System.out.println("Car2() 생성자 호출"); } // 추상메서드 public abstract void run(); } 그리고 부모가 가지는 추상메서드는 자식 클래스..
super는 인스턴스 부모를 참조할 때, 사용하는 키워드이다. 부모의 생성자를 호출할 때는 super()를 사용한다. super() 생성자는 부모 생성자를 의미하며, 생성자 안에서만 사용이 가능하다. 그리고 생성자 안에 첫번째 줄에만 올 수 있다. 생성자는 무조건 super()를 호출해야 한다. 사용자가 super() 생성자를 호출하는 코드를 작성하지 않았다면 자동으로 부모의 기본 생성자가 호출된다. 따라서 부모클래스가 기본 생성자를 가지고있지 않다면, 사용자는 반드시 직접 super() 생성자를 호출하는 코드를 작성해야 한다. 불변 객체 인스턴스가 생성될 때 필드에 값을 넣어주고, 객체 내 어떤 메서드도 필드의 값을 변경시킬 수 없는 객체
상속 관계는 is a(~는 ~이다.) 관계 또는 kind of(~는 ~의 종류이다.) 관계가 되어야 한다. 자식은 부모의 종류 중 하나이다. 그리고 여러 종류의 객체를 하나의 이름으로 부를 수 있는 것을 일반화라고 한다. 예를들어, 버스, 레미콘, 트럭을 자동차라고 부른다면 그것은 일반화시킨 것이다. 상속은 일반화와 확장의 개념을 합한 것이라고 생각하면 된다. 즉, 예를들어, 자동차에 삽을 달아놓는다고 하면 그것은 자동차를 확장시켜서 포크레인을 만든 것이다. 따라서 부모클래스를 상속받는다는 것은 부모가 가지고있는 것을 자식이 물려받아 사용할 수 있다는 것을 의미한다. 아무것도 상속받지 않으면 자동으로 java.lang.Object를 상속받는다. 그렇기 때문에 모든 클래스의 최상위 클래스는 Object가 ..
패키지 이름은 보통 도메인 이름을 거꾸로 적은 후에 프로젝트 이름 등을 붙여서 만들게 된다. 그리고 패키지 구조는 소프트웨어 아키텍처에 따라 달라진다. 즉, 구체적인 아키텍처를 가지고 있는 프로그램을 만들때, 패키지에 대해 이해할 수 있게 되는 것이다. 패키지 연습하기 com.example.util이란 패키지에 Calculator 클래스를 작성한다고 하자. 그러면 com.example은 도메인 이름을 거꾸로 적은 것이고, util은 프로젝트나 모듈의 이름이 된다. 그렇다면 패키지 이름을 작성할 때 왜 도메인 이름을 거꾸로 적는것일까? 우리는 오픈 소스를 사용하는데, 다른 사람이 만든 클래스 중에 내가 만든 클래스와 이름이 같은 경우가 있다. 하지만 같은 폴더에는 같은 이름의 파일이 여러 개가 있을 수 없..
추상화 추상화란 중요한 것은 남기고, 불필요한 것은 제거하는 것이다. 즉, 먼 미래까지 대비해서 클래스를 만들 필요는 없다. 예를들어, 고객 클래스를 만든다면, 이름, 성별, 나이가 필요하다면 그것만 가지도록 하고, 기능도 필요한 것만 가지도록 한다. 캡슐화 관련된 것을 잘 모아서 가지고 있는 것을 캡슐화라고 한다. 관련된 것을 잘 모아서 가지고 있을수록 응집도가 높다고 표현한다. 예를들어, Math라는 이름만 기억하면 수학과 관련된 기능이 필요할때 Math를 사용하면 되겠구나하는 점이 캡슐화가 잘된 것이다. 좋은 객체? 나쁜 객체? 자바는 객체 지향 프로그래밍 언어이고, 클래스가 설계도라면 이 클래스가 인스턴스가 되어 메모리에 올라갔을때 이 것을 객체라고 한다. 이때, 좋은 객체는 응집도는 높고, 결합..

Java 8 이상부터는 Metaspace가 사용된다. 여기에 클래스 정보가 올라간다. 여기서 Java Heap은 JVM이 관리하는 메모리 영역이고, Native Memory는 운영체제가 관리하는 메모리 영역이다. 클래스 파일 정보 자체는 정적이다. 하지만 동적인 것들은 실행되면서 생성되는 것들을 말한다. 따라서 JVM은 사용해야할 클래스의 정보를 읽어들여서 메모리에 올리게 된다. 왜냐하면, 클래스가 저장된 보조 기억장치는 RAM보다 속도가 느려 매번 이곳에서 읽어들이는 것은 성능을 저하시키기 때문이다. 결론적으로 클래스 정보는 처음 사용될 때 메모리에 그 정보를 올리고, 필요할 때마다 사용하게 된다. 예를들어, Person p1 = new Person(); Person p2 = new Person(); ..