반응형

자바 인터페이스

인터페이스는 추상 클래스(Abstract Class)의 일종으로 추상 클래스와 같이 추상 메소드를 같지만 값이 변하는 일반 멤버 변수는 가질 수 없습니다. JDK 1.8 이전 버전에서는 몸통(구현부)이 있는 일반 메소드를 가질 수 없었으나 JDK 1.8 버전부터는 디폴트 메소드와 정적 메소드 구현이 가능해졌습니다. 인터페이스는 inteface 키워드를 통해 선언하며 기능을 물려받는 클래스는 추상 클래스를 물려받는 것과는 다르게 상속(extends)이 아닌 구현(implements)한다고 표현합니다.

interface 인터페이스명 {
	
    // 상수 선언
    public static final 타입 상수이름 = 값;
    
    // 추상 메소드 선언
    public abstract 타입 메소드명();
	
    // 디폴트 메소드
    default 타입 메소드명();
    
    // 정적 메소드
    static 타입 메소드명() {
    	// 구현부
    }
}

위와 같이 상수, 추상 메소드, 디폴트 메소드, 정적 메소드를 구성원으로 가질 수 있습니다.

인터페이스를 사용하는 이유

인터페이스를 사용하면 구현하는 클래스에게 일부 구성원 구현에 대해 강제할 수 있습니다. 추상 메소드를 오버라이딩을 통해 구현해야 하며 인터페이스가 제공하는 정적 메소드를 무조건 사용해야 합니다. 이는 자바의 다형성을 극대화하여 코드의 생산성을 높이고 프로그램 유지, 보수의 용이성을 높이기 위함에 있습니다.

인터페이스의 구현

인터페이스도 추상 클래스와 마찬가지로 혼자서는 객체를 생성할 수 없습니다. 즉 추상 클래스가 하위 클래스에서 상속을 통해 추상 메소드를 완성시키는 것과 같이 인터페이스도 구현 클래스에서 추상 메소드를 완성시킵니다.

class 클래스명 implements 인터페이스명 {
	
    // 인터페이스를 구현하면 인터페이스에 선언된 추상 메소드를 반드시 구현해야 합니다.
    
}

인터페이스와 추상 클래스의 차이

얼핏 봤을 때 인터페이스와 추상 클래스는 구현(implements)하고, 상속(extends)한다는 키워드만 제외하고 보면 둘 다 추상 메소드를 갖으며 스스로 객체를 생성할 수 없다는 점에서 같아 보입니다. 하지만 자바에서는 추상 클래스의 다중 상속을 막아두었기 때문에 인터페이스를 통해 다중 상속을 할 수 있고 구현하는 모든 클래스에 대해 특정한 메소드를 반드시 구현하도록 강제할 수 있습니다.

반응형
반응형

자바 추상 클래스

  추상 클래스는 하나 이상의 추상 메소드를 포함한 클래스를 말합니다. 추상 클래스는 생성 시 클래스명 앞에 'abstract'라는 키워드를 붙여 해당 클래스가 추상 클래스임을 나타냅니다. 추상 클래스의 기본 조건이 추상 메소드를 하나 이상 포함하는 것이라고 했는데 추상 메소드도 마찬가지로 리턴 타입 앞에서 abstract를 붙여 추상 메소드임을 나타냅니다.

public abstract class 클래스명 {
	
    public abstract void 메소드명(); // 구현부({})는 작성하지 않고 남겨둡니다.
    
}

추상 클래스와 추상 메소드는 위의 코드처럼 작성합니다.

// 추상클래스
public abstract class Animal {
	
	public abstract void move();
	
}

// 위의 추상클래스 Animal을 구현한 Man 클래스
class Man extends Animal {
	
	@Override
	public void move() {
		System.out.println("두 발로 이동합니다.");
	}
}

// 위의 추상클래스 Animal을 구현한 Bird 클래스
class Bird extends Animal {
	
	@Override
	public void move() {
		System.out.println("날아서 이동합니다.");
	}
}

위 코드를 보면 추상 클래스 하나와 추상 클래스를 상속받은 두 개의 클래스가 있습니다. 동물은 모두 이동을 하지만 이동하는 방법에는 차이가 있습니다. 사람은 두 발로 걸어서 이동하고 새는 날아서 이동하지만 둘 다 '이동' 한다는 것은 다르지 않기 때문에 추상 클래스 Animal에서 추상 메소드 move()를 선언하여 Man과 Bird 클래스가 상속받아 클래스에 맞게 오버라이딩을 해 준 것입니다.

상속을 받으면 부모 클래스가 갖고 있는 추상 메소드를 반드시 오버라이딩 해야 합니다.

추상 클래스를 상속받은 클래스는 부모 클래스가 갖고 있는 추상 메소드를 받드시 오버라이딩 해야 합니다. 그렇지 않으면 위의 이미지 17번째 줄처럼 클래스명에 빨간줄이 생기면서 오류가 발생하는 것을 확인할 수 있습니다.

반응형

'Java > Java 객체 지향' 카테고리의 다른 글

[Java] DTO란?  (0) 2022.02.08
[Java] 자바 MySQL 연동  (0) 2021.05.13
[Java] 데이터 베이스를 연동한 DButil 클래스 만들기  (0) 2021.01.05
[Java] 인터페이스(Interface)  (0) 2020.12.28
반응형

자바의 String 클래스 배열

  String도 int 배열과 다르지 않습니다. 같은 방법으로 선언, 생성할 수 있으며 초기화 방법도 같습니다.

String 배열 초기화

String[] name = new String[3]; // 길이가 3칸인 String 배열 name을 생성

// 1번째 방법

name[0] = "SMITH"; // 0번 인덱스에 값 입력 * 인덱스는 0에서 시작
name[1] = "SCOTT"; // 1번 인덱스에 값 입력
name[2] = "ROONEY"; // 2번 인덱승에 값 입력

// 2번째 방법

name = {"SMITH", "SCOTT", "ROONEY"}; // 초기화 방법만 다르고 1번째 방법과 완전 동일한 배열

 

반응형
반응형

Java 캐스팅

  변수 또는 상수의 타입을 다른 타입으로 변환하는 것을 말합니다.

double a = 10.5;
int score = (int)a;

10.5의 값을 갖는 double 타입의 변수 a와 변수 a를 int 타입으로 캐스팅한 변수 b를 생성하고 출력합니다.
int로 변환되면서 변수 b는 정수 10이 되어 출력됩니다.
국영수 평균을 계산을 계산해봅니다.
ave의 타입이 int형이기 때문에 출력시 소수점은 출력되지 않아 83까지만 출력됩니다.
ave의 타입을 double로 바꿔주고 국영수 총점을 담은 변수 tot를 double 타입으로 캐스팅합니다.
다시 출력하면 소수점 뒷자리도 정상적으로 출력됩니다.
캐스팅을 이용하면 자신이 원하는 소수점 n번째 자리까지 출력하는 것도 가능합니다.

(double)tot/3은 위에서 보신 것처럼 83.3333...으로 출력되었습니다.

여기에 100을 곱하면 8333.3333...으로 바뀌고 이것을 다시 int형으로 캐스팅하면 소수점 뒷자리가 사라집니다.

* ave가 double 타입이기 때문에 사라진 3333..은 0으로 표현되어 8333.0이 됩니다.

이것을 다시 double 타입의 숫자 100으로 나누면 소수점 둘째 자리까지 83.33이 출력됩니다.

캐스팅을 통해 소수점 둘째 자리까지 출력

반응형

'Java > Java 기초' 카테고리의 다른 글

[Java] 연산자의 종류  (0) 2020.12.30
[Java] String 배열  (0) 2020.12.25
[Java] 배열의 선언 / 생성  (0) 2020.12.25
[Java] Integer.parseInt() / Integer.toString(), String과 int 형 변환  (0) 2020.12.23
[Java] String(문자열)  (0) 2020.12.22

+ Recent posts