익명 함수 먼저 익명 함수라는 것은 말 그대로 이름이 없는 함수를 말한다. 익명 함수를 사용하는 이유는 나중에 다시 부를 일이 없으므로 프로그램 안에서 일시적으로 한 번만 사용되고 버려져도 되는 객체일 때 사용하는 것이다. 일회성이기 때문에 메모리 관리에서 효과적이다. 바로 익명 함수를 사용하는 예제를 보도록 하자. public abstract class AMin { public abstract int getMin(int x, int y); } // AminAnonymous 클래스를 사용한 익명 함수 사용 public class AminAnonymous{ public static void main(String[] args) { AMin aMin = new AMin() { @Override // 외부에서 ..
다중 상속 추상 클래스와 인터페이스를 공부했다면 추상 클래스와 인터페이스의 차이점에 대해 의문이 생길 것이다. 추상 클래스와 인터페이스의 공통점은 메소드의 선언만 할 수 있고 구현부가 없다는 점, 상속받은 클래스에서 추상 메소드를 구현해야 한다는 점이라고 할 수 있다. 그러면 추상 클래스 하나만 있어도 인터페이스의 역할을 다 할 수 있는 것이 아닐까?라는 생각이 들텐데 자바의 다중 상속 부분에서 차이가 난다. 일단 자바는 다중 상속이 불가능하다. 여기서 다중 상속이란 아래와 같이 자식 클래스의 부모가 여러 개인 것을 말한다. // 잘못된 코드 public class Vehicle extends Bus, Car { } 그러면 왜 다중 상속이 불가능할까라는 생각이 들 것이다. 만약에 Bus 클래스에도 dri..
h2 데이터베이스와 JDBC를 연결할 때 발생하는 오류 중 하나이다. 위와 같은 오류가 발생한다면 아래와 같이 해보자. 해결 방법 드라이버가 프로젝트 안에 있는지 확인해보도록 한다. 1) 프로젝트의 src 아래 lib폴더를 생성해준다. 2) 구글에서 h2 maven repository 검색 후 최신 버전의 jar 파일을 설치한다. 이 경우는 h2 데이터베이스를 사용할 때이므로 다른 데이터베이스를 사용하고 있을 때 오류가 발생한다면 그 데이터베이스에 맞는 드라이버를 설치해줘야한다. 3) 다운로드 받은 jar 파일을 1번에서 생성한 lib 폴더 아래 넣어준다. 4) 프로젝트의 Build Path ModulePath 지정을 해준다. Add External JARs를 통해 아까 설치한 jar 파일을 선택한 후 ..
인터페이스 인터페이스란 실제 메소드를 정의하고 구현하는 것이 아니라 메소드의 헤더 부분(시그니처)만 선언하며, 이 메소드를 실제 정의하는 클래스에서 메소드 본체를 완성하는 것을 말한다. 개발 코드와 객체가 서로 통신하는 접점 역할을 하는데 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다. 여기서 개발 코드가 직접 객체의 메소드를 호출하면 되는데 왜 중간에 인터페이스를 두는 것인지 의문이 생길 수도 있다. 그 이유는 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위해 인터페이스를 사용하는 것이라고 할 수 있다. 즉, 코드 변경 없이 실행 내용과 리턴 값을 다양화할 수 있다는 장점을 가지게 된다는 것이다. 인터페이스는 상수 필드와 추상 메소드만을 구성 멤..
사전적 의미로 추상은 실체 간에 공통되는 특성을 추출한 것을 말한다. 추상 클래스 객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면 이 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 한다. 즉, abstract 키워드가 붙는 클래스는 객체로 인스턴스를 생성할 수 없다는 뜻이다. 그리고 실체 클래스와 추상 클래스는 상속 관계를 가지고 있다. 이러한 추상 클래스의 예로 동물을 들 수 있다. 동물 클래스는 현실 세계에 실체가 없으므로 abstract를 사용한 추상 클래스라고 할 수 있고, 실제로 존재하는 물고기, 새 등이 실체 클래스라고 할 수 있다. public abstract class AbstractCalc { int add(int x, int y) { return x+y..
부모 생성자를 호출하는 super() super()는 부모의 기본 생성자를 호출하기 위해서 사용한다. 만약에 자식 클래스의 생성자가 명시적으로 생성되지 않는다면 컴파일러는 아래와 같은 기본 생성자를 생성한다. public 자식 클래스명(){ super(); } 기본 생성자를 추가해주는 것은 앞에서 정리한 내용이라 익숙한데 super()라는 코드가 새롭게 추가된 것을 볼 수 있다. 자바 컴파일러는 부모 클래스의 생성자를 명시적으로 호출하지 않는 모든 자식 클래스의 생성자 첫 줄에 자동으로 super()를 추가하여, 부모 클래스의 멤버를 초기화할 수 있도록 해준다. 만약 직접 자식 생성자를 선언하고 명시적으로 부모 생성자를 호출하고 싶다면 아래와 같이 작성하면 된다. 자식 클래스명(매개변수1, 매개변수2, ..
아직 MVC 패천에 대해서 깊게 배우지 않았기 때문에 MVC가 각각 무엇을 뜻하는지 정도만 정리하고 그 이상은 추후에 정리하도록 하겠다. MVC는 개발할 때 사용되는 디자인 패턴을 말한다. M은 Model, V는 View, C는 Controller를 뜻한다. 하나씩 알아가보자. Model 데이터를 가진 객체를 말한다. DAO (Data Access Object) 데이터베이스의 데이터 접근하기 위한 객체로 DB에 접근하기 위한 로직을 분리하기 위해 사용한다. 직접 DB에 접근해서 데이터를 CRUD를 한다. DTO (Data Transfer Object) 계층 간 데이터 교환을 위한 역할을 하고, 로직을 가지지 않는 객체이며 getter와 setter 메소드만 가진 클래스를 의미한다. VO (Value Ob..
일반적으로 객체 지향 프로그래밍에서는 객체의 필드를 객체 외부에서 직접적으로 접근하는 것을 막는다. 왜냐하면 외부에서 마음대로 변경할 경우 객체의 무결성(의도하지 않은 요인에 의해 데이터, 시스템 등이 변경되거나 손상되지 않고 완전성, 일관성 등을 보장하는 특성)이 깨질 수 있기 때문이다. 예를 들어서 나이나 속도는 음수가 될 수 없는데 외부에서 음수로 변경한다면 무결성이 깨지게 되는 것이다. 그렇기 때문에 객체 지향 프로그래밍에서는 메소드를 통해서 필드를 변경해야 한다. 클래스를 선언할 때 필드(멤버 변수)는 private로 선언해서 외부로부터 보호하고, 필드는 getter와 setter 메소드를 이용해서 읽어오고 사용하는 것이 좋다. 그렇다면 getter와 setter가 무엇일까? getter와 se..