일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- lambda
- String
- 토비의스프링
- DesignPattern
- JPA
- 자바
- Kotlin for Java Developers
- springboot
- gradle
- 프록시
- DispatcherServlet
- java
- Immutable
- ORM
- FunctionalInterfaces
- 링킹
- Spring
- beanfactory
- 클린코드
- 링커
- exception
- ApplicationContext
- springwebmvc
- hibernate
- 토비의스프링3.1
- AutoConfiguration
- 컴퓨터시스템
- 메이븐
- 빌드툴
- IOC
- Today
- Total
목록프로그래밍/Java (31)
엔지니어로 가는 길
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Oak27/btqJnFllM9v/2Qs0bDmZo1tPpkAU7NkOSk/img.png)
Type Inference 자바 컴파일러가 타입을 추론하는 것을 Type Inference라고 한다. 컴파일러는 추론을 위해 method invocation과 그에 상응하는 declaration을 살펴본다. 추론 알고리즘은 인자의 타입을 결정하고, 가능한 경우에 결과가 할당되는 타입 또는 리턴되는 타입까지 결정한다. 추론 알고리즘은 모든 인자와 어울리는 선(공통 부모)에서 가장 구체적인 타입을 찾는다. 아래의 pick 메소드를 살펴보자. pick 메소드의 type 매개변수는 T이고 메소드의 매개변수 a1과 a2 모두 T이다. 하지만 pick을 호출할 때 첫 번째 인자로 String을 주었고 두 번째 인자로 ArrayList를 주었다. 이런 경우에 모든 인자와 어울리는 선(공통 부모)이란 Serializa..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cflogS/btqIuLm5jZy/Ay62mdG1Nd0064KahLkifK/img.png)
Error java.lang.Error 클래스의 서브 클래스들이 해당된다. 에러는 시스템에 뭔가 비정상적인 상황이 발생했을 경우 사용된다. 그래서 주로 JVM에서 발생시킨다. 애플리케이션 코드는 에러를 잡으려고 하면 안 된다. 아무런 대응 방법이 없기 때문이다. Exception java.lang.Exception 클래스와 그 서브클래스들이 해당된다. 에러와 달리 애플리케이션 코드의 작업 중 예외상황이 발생했을 경우 사용된다. Exception 클래스는 체크 예외와 언체크 예외로 구분되는데, 전자는 RuntimeException을 상속하지 않은 것들이고, 후자는 상속한 클래스들을 말한다. Checked Exception(체크 예외) 일반적으로 예외라고 하면 Exception 클래스의 서브클래스 중에서 R..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/zj6eK/btqIvYep46a/TcnLUYeOHb2MrDI2ub8sKk/img.png)
JAVA SE 8 이후의 Annotations 1. Type Annotations and Pluggable Type Systems 자바8 이전에는 어노테이션이 declarations에만 적용될 수 있었다. 하지만 자바8부터 어노테이션이 type use에도 적용될 수 있다. 다시 말해, 타입을 사용하는 곳이면 어디든 어노테이션을 사용될 수 있다는 뜻이다. Class instance creation expression: Type cast: Implements clause: Thrown exception declaration: 이러한 형태의 어노테이션을 타입 어노테이션이라 부른다. 타입 어노테이션은 analysis of java code를 향상시키고 더 강한 type checking을 보장할 수 있다. 특징 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/qQ2ns/btqH8bx0i9a/XgYvW4dt40j0WHneSVJ0mk/img.png)
출처: http://docs.oracle.com/javase/tutorial/java/annotations/ annotate add notes to (a text or diagram) giving explanation or comment. 어노테이션이란 메타데이터의 형식으로 프로그램에 대한 데이터(이는 프로그램의 일부는 아니다)를 제공한다. 어노테이션은 가리키는 코드의 동작에 직접적인 영향을 미치지는 않는다. 어노테이션의 용도 컴파일러을 위한 정보 제공 어노테이션은 에러를 잡아내거나 경고를 무시하기 위해 컴파일러에 의해 사용될 수 있다. 컴파일 타임, 개발 타임 처리 소프트웨어 도구는 코드, xml 파일 등을 생성하기 위해 어노테이션 정보를 이용할 수 있다. 런타임 처리 일부 어노테이션은 런타임에 사용될..
http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html 우리는 컴퓨터로 조종하는 자동차 소프트웨어 프로그래머다. 우리는 자동차를 조종하는데 사용하는 메소드를 가진 인터페이스를 만들었고 잘 사용중이다. 근데 만약 자동차에 새로운 기능을 추가해야 한다면 어떨까? 그냥 기존의 인터페이스에 메소드를 추가하면 될까? 기존의 인터페이스에 메소드를 추가하면, 인터페이스를 구현한 클래스도 수정해야만 한다. 인터페이스를 구현하는 클래스는 abstract 클래스가 아닌 이상, 인터페이스의 모든 메소드를 구현해야만 하기 때문이다. static 메소드로 추가한다면, 동료들이 새로운 메소드를 필수적인 메소드가 아니라 유틸리티성 메소드로 여길지 모른다. 이럴 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bgq5hn/btqFg4BT72x/jc7wYkQOXzmz1UtvuSKZx0/img.png)
https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html Method references 람다 표현식에서 하는 일이라고는 이미 존재하는 메소드를 호출하는 게 전부인 경우 Method references를 사용할 수 있다. 이는 말 그대로 (일반적인 람다 표현식의 문법을 따르는 것이 아니라) 그 메소드의 이름을 언급하는 것인데 람다 표현식을 사용한 것보다 간결하고 명확하다. Person이라는 클래스를 예로 들어보자. age라는 변수를 가지고 있고, compareTo는 두 개의 Person 객체를 인자로 받아 age를 비교하는 static 메소드이다. 세 개의 Person 객체를 만든 뒤 배열에 넣고 Arrays의 sort 메소드를 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bh6A5R/btqFaCUotW7/Ay1YB0fi3CROKGHFKwVVr0/img.png)
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html standard functional interfaces는 java.util.function에 있는 인터페이스로 java 1.8부터 지원한다. Consumer는 standard functional interfaces 중 하나이다. Interface Consumer 하나의 인자를 받아 연산을 수행하지만 아무것도 리턴하지 않는다. 다른 대부분의 functional interfaces와 달리 side-effects를 기대하는 인터페이스..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/vkkQ5/btqE40HlVLi/pJuvlx4eV1xK8CH6rWKF6k/img.png)
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html 이름이 없는 익명 클래스가 이름 있는 클래스보다 더 간결하지만 하나의 메소드만 갖는 클래스의 경우에는 익명 클래스조차 과하다. 람다 표현식을 이용하면 하나의 메소드만을 갖는 클래스의 객체를 익명 클래스보다 더 간결하고 분명하게 표현할 수 있다. 람다 표현식의 문법 -괄호로 속 콤마로 구분되는 형식 매개변수의 리스트 람다 표현식에서 매개변수의 데이터 타입을 생략할 수 있다. 또한 매개변수가 하나라면 괄호도 생략할 수 있다. -arrow token: -> -body: 단일 표현식이나 statement block 위와 같이 body가 단일 표현식으로 이루어진 경우 표현식을 계산..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/453cD/btqEsEexjv7/gKx6wSl2LwKTOh3O6Xnav1/img.png)
출처: https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html 익명 클래스 - 익명 클래스를 사용하면 코드를 더 간결하게 만들 수 있다. - 익명 클래스는 정의되는 동시에 객체가 생성된다. - 이름이 없다는 점을 빼면 지역 클래스와 유사하다. (지역 클래스를 한 번만 사용하면 되는 경우라면 익명 클래스를 사용하라.) - 익명 클래스는 자신을 포함하는 외부 클래스(이하 enclosing class)의 멤버에 접근할 수 있다. (final 또는 유사 final로 선언된 변수에만 접근할 수 있다.) (지역 클래스에서도 final 변수 또는 유사 final로 선언된 변수에만 접근할 수 있는 것 같다.) - 중첩 클래스와 마찬가지로 익명..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/kS4Mv/btqEhPmNLYP/ODWdovv1sgHcMcs1PDk891/img.png)
출처: https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html 지역 클래스(Local Classes) 지역 클래스는 블록 안에 정의된 클래스를 말한다. 아래 이미지에서 EnglishGreeting은 지역 클래스이다. 꼭지 1. 지역 클래스의 선언 2. Enclosing class 멤버에 접근하기 (*Enclosing class란 지역 클래스를 포함하고 있는 클래스) 3. 지역 클래스와 내부 클래스의 유사성 1. 지역 클래스의 선언 지역 클래스는 표현식, statements, 블록 모두에서 정의할 수 있다. 예를 들어 메소드의 body나 for문이나 if문 안에서 지역 클래스를 정의할 수 있다. 2. Enclosing class의 멤버에..