[Java 객체지향] 인터페이스의 요소
·
Java & Kotlin
Calc.java 디폴트 메서드 (default method) - 자바 8 이후 default void discription() { System.out.println("정수 계산기를 구현합니다."); myMethod(); } 구현부(body)를 가지는 메서드로 인터페이스를 구현하는 클래스에서 공통으로 사용할 수 있는 메서드이다. 같은 메서드를 반복해서 구현해야 하는 일을 줄이기 위해서 만들어진 메서드이다. 구현하는 클래스에서 재정의하여 사용할 수 있다. 인터페이스를 구현한 클래스의 인스턴스가 생성되어야 사용할 수 있다. 정적 메서드 (static method) - 자바 8 이후 static int total(int[] arr) { int total = 0; for (int num : arr) { tota..
[Java 객체지향] 인터페이스 활용 (DAO 구현 해보기)
·
Java & Kotlin
Strategy Pattern 하나의 인터페이스를 여러 클래스가 구현하면 경우에 따라 다른 정책을 적용할 수 있다. 클라이언트 프로그램은 인터페이스의 메서드를 이용해서 여러 객체를 구현한다. (다형성) 인터페이스를 활용한 DAO(Data Access Object) 구현하기 DAO가 Oracle, MySQL 등 DB에 따라 다르면 이중으로 코드를 관리해야 하고 오버헤드가 발생한다. 또 각 코드마다 다른 버그가 발생할 수 있으며 버그 패치를 하거나 기능을 업그레이드할 때 일일이 써주어야 한다. → 유지보수 어렵다. 서비스 혹은 솔루션을 하는 회사에서 버전 관리를 어떻게 할지도 굉장히 중요하다. 따라서 하나의 소스에서 해결 방안을 찾는 것이 좋다. → 인터페이스 활용하여 DB마다 다른 버전의 DAO를 둔다 D..
[Java 객체지향] 인터페이스
·
Java & Kotlin
인터페이스 모든 메서드의 구현 코드가 없는 추상 자료형 모든 메서드가 추상 메서드로 선언된다. (public abstract) 모든 변수는 상수로 선언된다. (public static final) - 인터페이스는 구현코드가 없으므로 멤버 변수를 가질 수 없음 따로 키워드를 넣어주지 않아도 자동으로 추상 메서드 또는 상수로 컴파일 된다. 자바에서 모호성을 피하기 위해 단일 상속만 가능하지만, 인터페이스는 구현 코드가 없기 때문에 여러개를 구현하는데 모호성이 발생하지 않는다. 구현과 상속 인터페이스를 다른 클래스에서 구현하는 것은 상속과는 다른 의미이다. 상속은 이미 구현된 코드를 재사용하는 것이다. 인터페이스는 구현된 코드가 없다. 다른 클래스에서 인터페이스에 선언된 메서드를 재정의하여 사용하는 것을 인터..
[Java 객체지향] 추상 클래스 활용 (템플릿 메서드 패턴)
·
Java & Kotlin
라이브워크 - Java Development Kit - JDK의 많은 라이브러리들을 가져다 사용할 수 있다. - flow의 제어권은 프로그래머에게 있다. 프레임워크 - Android - 흐름(시나리오)이 정해져 있다. - 화면의 생성, 소멸 과정 등은 정해져 있다. - 프로그래머는 place hole 역할 (리스트 or 버튼을 올리는 세부적인 기능 구현) 템플릿 메서드 패턴 프레임 워크에서 많이 사용하는 패턴 틀을 가진 메서드 추상 메서드나 구현된 메서드를 이용하여 코드의 흐름(시나리오)를 정의하는 메서드 템플릿 메서드가 정의된 상위 클래스를 상속받은 클래스에서 추상 메서드를 구현해준다. 흐름은 변해서는 안되기 때문에 메서드에 final 키워드를 사용해서 하위 클래스에서 재정의할 수 없게 한다. Fina..
[Java 객체지향] 추상 클래스
·
Java & Kotlin
추상 클래스 (absract class) 구현부가 없고 선언부만 있는 추상 메서드를 포함한 클래스 메서드 선언 (메서드의 시그니처) : 반환타입, 메서드 이름, 매개변수로 구성 메서드 정의 : = 메서드 구현, body {} 부분 구현 추상 클래스는 new 키워드로 인스턴스를 생성할 수 없다. (인스턴스화 할 수 없음) → 추상 메서드의 구현 코드가 없기 때문 상속을 하기 위해 만든 클래스이다. int add(int x, int y);// 추상 메서드 int add(int x, int y){};// 구현부가 있으므로 추상 메서드 X 예제 코드 클래스 다이어그램 Computer.java 추상 메서드는 absract 키워드를 이용해 정의 구현의 책임은 하위 클래스에 위임한다. 모든 클래스에서 공통으로 사용할..
[Java 객체지향] 다운 캐스팅과 instanceof
·
Java & Kotlin
다운 캐스팅 업캐스팅이 된 인스턴스가 원래 자신의 타입으로 형 변환 하는 것이다. 명시적으로 해주어야 함 Customer vc = new VIPCustomer();// 묵시적 VIPCustomer vCustomer = (VIPCustomer)vc;// 명시적 instanceof VIPCustomer vc = (VIPCustomer)customerPark; GoldCustomer 타입의 인스턴스인 customerPark을 VIPCustomer 클래스로 형변환하려고 하면 run시 오류가 난다. (컴파일 오류는 X → 이클립스는 인스턴스의 타입까지는 알 수 없음) 이럴 경우 인스턴스의 타입을 확인해주는 조건문이 필요하다. 이때 사용되는 키워드가 instanceof이다. if(customerPark instan..
[Java 객체지향] 다형성
·
Java & Kotlin
다형성 (Polymorphism) 하나의 코드가 여러 자료형으로 구현되어 실행되는 것 같은 코드에서 다른 실행 결과가 나온다. 정보은닉, 상속과 더불어 객체지향 프로그래밍에서 가장 큰 특징 중 하나이다. 유연하고, 확장성있고, 유지보수가 쉬운 프로그램을 만들 수 있다. 상속, 오버라이딩, 오버라이딩 등을 활용해서 구현할 수 있다. 예제 코드 AnimalTest.java package ch06; class Animal{// 상위 클래스 public void move() { System.out.println("동물이 움직입니다."); } } class Human extends Animal{// 하위 클래스 1 public void move() { System.out.println("사람이 두 발로 걷습니다...
[Java 객체지향] 메서드의 재정의와 가상 메서드 원리
·
Java & Kotlin
메서드의 호출과 실행 프로그램이 메모리로 올라올 때 Data 영역과 Code 영역으로 나뉘게 된다. 이 때, Code 영역에는 method, 즉 instruction set이 저장된다. 인스턴스는 힙메모리에 따로 생성되고, instruction set은 처음 프로그램 로드시 한번만 로드된다. instruction set은 인스턴스마다 다른 기능을 제공하는 것이 아닌 동일한 기능을 제공한다. 달라지는 것은 메서드에 사용되는 스택에 저장된 멤버 변수와 힙에 저장된 인스턴스이다. 따라서 다른 인스턴스라도 메서드의 코드는 같으므로 같은 메서드를 호출한다. 함수가 호출이 되면 Code 영역에 저장된 instruction set를 찾아 호출한다. 함수의 이름은 주소로 변환되므로 같은 이름의 함수는 존재하지 않는다...
[Java 객체지향] 오버라이딩 (메서드 재정의)
·
Java & Kotlin
오버라이딩 (Overriding) 하위 클래스는 상위 클래스의 메서드를 그대로 사용할 수 있지만, 재정의하여 사용할 수도 있다. 오버로딩과 달리 메서드의 이름, 반환 타입, 매개 변수 등 정의부는 일치해야 한다. 멤버십 클래스 구현하기 ← 오버라이딩을 활용해 VIP 고객은 가격을 할인해주는 기능을 구현해보자 VIPCustomer.java calcPrice 상속받아 재정의 @Override public int calcPrice(int price) { bonusPoint += price * bonusRatio; price = (int)(price * (1 - salesRatio)); return price; } CustomerTest.java 각 인스턴스 생성하고 calcPrice(1000) 수행 Custo..