※우선 이 글은 자바가 설치되어 있다는 가정하에 이클립스를 기반으로 작성합니다.
요즘 운동을 다시 시작해서 일어날 때 뻐근한데 자바 공부를 하니까 머리가 더 뻐근해서 오히려 빨리 운동하는 시간이 왔으면 좋겠다는 생각이 들어요. 오늘 제가 공부를 하면서도 너무 헷갈리는 것들이 많더라고요. 복습이 필요한 시간 같습니다. 그런 의미로 내일 포스팅은 복습, 요약정리 포스팅이거나 없을 수도 있습니다. 이 점 참고해 주시면 감사하겠습니다.
오늘 공부 순서는
1. 인터페이스란?
2. 다형성이란?
3. 객체 클래스란?
이렇게 구성되어 있습니다. 그럼 시작하겠습니다.
인터페이스란?
-인터페이스(interface) : 자바에서 다중 상속을 구현하게 해주는 기술.
추상 클래스보다 더 추상화의 정도가 높아 체계적인 프로그램 설계를 위해 사용된다.
인터페이스는 팀 프로젝트의 동시 작업에 유리하고 일반적으로 추상보다 요구되는 설계의 기준이 높아 더 체계적이다.
-> 추상보다 엄격한 설계 -> 선언한 메소드를 상속받는 클래스에서 선언한 메소드를 하나라도 구현을 안 하면 오류가 발생한다. -> 중복되는 메소드의 경우 한 번만 구현을 해도 오류가 발생하지 않는다.
※인터페이스는 extends가 아닌 implements를 사용한다.
추상클래스 | 추상메소드 외에 멤버변수나 일반 메소드를 가질 수 있다. ->public 메소드를 선언한 경우 기능 구현을 안하면 오류가 발생한다. |
인터페이스 | 반드시 사전에 정의된 추상 메소드와 상수만을 가질 수 있다. ->public 메소드를 선언한 경우 기능을 구현하면 오류가 발생한다. |
위에서 인터페이스가 다중 상속을 구현하게 해주는 기술이라 설명했는데 코드로 설명하면 오히려 장황할 것 같아 간단히 보여드리겠습니다.
상속은
public class Ex extends Dog, Cat -> 이와 같이 클래스 2개를 상속받으면 오류가 발생하지만
인터페이스는
public class Ex implements Dog, Cat -> 이와 같이 인터페이스 2개를 상속받아도 오류가 발생하지 않습니다.
이렇게 알아두시면 될 것 같습니다.
일단 간단한 코드로 인터페이스의 사용에 대해서 알아보겠습니다.
코드
1
2
3
4
5
6
|
public interface Dog {
abstract void crying();
public void show(); //인터페이스에서 메소드의 내부 기능을 구현하려하면 오류가 뜬다.
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public class Main implements Dog { //인터페이스는 extends가 아닌 implements를 사용한다.
public static void main(String[] args) {
Main main = new Main(); //한 번만 구현을해도 오류발생 x
main.crying();
main.show();
}
@Override
public void crying() {
System.out.println("으르르 컹컹!");
}
@Override
public void show() {
System.out.println("Hello World!");
}
}
|
cs |
추상이랑 굉장히 유사하죠? 하지만 추상이었다면 public void show(); 에서 내부 기능을 구현하지 않았기 때문에 오류가 발생하였을 겁니다. 이 점만 알아주시면 됩니다.
다형성이란?
-다형성(Polymorphism) : 다양한 형태의 성질을 가진다는 의미
-> 다형성을 특징으로 가지는 객체 지향 프로그래밍 언어 = 자바
객체를 사용할 때 사용하는 변수 형태를 바꾸어 여러 타입의 객체 참조 가능
다형성의 개념을 적절하게 이용할 때 프로그램의 소스 코드의 유연한 구성 가능
※다형성은 부모 클래스 타입의 참조 변수로 하위 클래스의 객체를 참조 가능하게 함.
-> 자신을 상속하는 자식 클래스를 자신의 변수로 불러와서 사용.
ex) 사람이 동물들한테 울라고 말하면 오리는 꽥꽥, 강아지는 멍멍, 고양이는 야옹
아직은 위의 예만 보고는 이해가 쉽지 않을 텐데요.
과일 정보를 확인하는 코드를 한 번 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class Fruit {
String name; //이름
int price; //가격
int fresh; //신선도
public void show() {
System.out.println("이름 :" + name);
System.out.println("가격 :" + price);
System.out.println("신선도 :" + fresh);
}
}
|
cs |
1
2
3
4
5
6
7
8
9
|
public class Orange extends Fruit {
public Orange() { //부모 클래스에서 선언한 변수 초기화
name = "오렌지";
price = 2000;
fresh = 10;
} //변수 초기화를 해주지 않을경우 null과 0을 반환한다.
}
|
cs |
1
2
3
4
5
6
7
8
|
public class Main {
public static void main(String[] args) {
Fruit fruit = new Orange(); //부모클래스의 변수로써 자식클래스의 인스턴스를 넣어줄 수 있다.
fruit.show();
}
}
|
cs |
Fruit fruit = new Orange(); //부모 클래스의 변수로써 자식 클래스의 인스턴스를 넣어줄 수 있다.
-> 이 부분이 다형성입니다.
추가로 부모 클래스의 변수로 사용하는 자식 클래스의 인스턴스가 여러 개일 경우 다형성에 따라서 사용자가 입력하는 값에 따라 완전히 다른 인스턴스를 보여줄 수 있습니다.
ex) 게임 캐릭터를 생성할 때 전사를 선택하면 전사의 정보, 마법사를 선택하면 마법사에 대한 정보를 출력한다.
객체 클래스란?
-객체(Object) 클래스 : 모든 객체의 조상.
->자바의 모든 클래스는 암시적으로 Object 클래스를 상속받고 있다.
존재 이유 : 모든 클래스가 공통으로 포함하고 있어야 하는 기능을 제공하기 위해서
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public class Warrior { // == public class Warrior extends Object
String name;
String power;
public Warrior(String name, String power) { //Warrior클래스의 생성자
this.name = name;
this.power = power;
}
//여기서 Object를 Warrior형으로 바꿀 수 있는 이유는 Object가 Warrior형태의 더 부모 클래스이기 때문이다.
public boolean equals(Object obj) { //매개변수로 들어온 obj가 Warrior클래스의 인스턴스와 동일한지 보는 것
Warrior temp = (Warrior) obj; //다형성을 이용해서 obj를 temp로 바꿀 수 있다.
if(name == temp.name && power == temp.power) {
return true;
}
else {
return false;
}
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
|
public class Main {
public static void main(String[] args) {
Warrior one = new Warrior("전사1", " 엄청 강함");
Warrior two = new Warrior("전사1", " 엄청 강함");
System.out.println(one == two);
//두 인스턴스가 내부적으로 가지는 값이 같더라도 인스턴스 자체를 비교하면 두 개의 인스턴스는 다르기 때문에 false를 반환한다.
System.out.println(one.equals(two));
} //equals는 인스턴스가 내부적으로 가지는 값을 비교하므로 true
}
|
cs |
원래는 다음에 객체지향의 활용에 대한 코드를 보여드리려고 했는데 예제로 보는 편이 나을 것 같아 예제 문제로 내겠습니다.
예제입니다. 풀이는 다음 포스팅에서 확인할 수 있어요.
예제 1. 1을 입력하면 오렌지에 대한 정보가, 2를 입력하면 사과에 대한 정보가 출력되는 프로그램을 다향성을 이용하여 작성하시오.
-> 클래스는 Fruit, Orange, Apple, Main 으로 구성, 정보는 이름, 가격, 신선도로 구성
예제 2. 게임 캐릭터 공격하는 프로그램(캐릭터는 기본적으로 펀치를 날릴 수 있다. Player, Warrior, Archer, Wizard, Main 클래스로 구성되며 전사는 파워 슬래시, 궁수는 파이어 애로우, 마법사는 메테오를 사용할 수 있다. + 다형성, 객체 클래스가 사용된다.)
'자바 공부' 카테고리의 다른 글
[JAVA]초보 개발자 김주호와 기초부터 시작하는 자바공부 5일차 (0) | 2021.01.18 |
---|---|
[JAVA]초보 개발자 김주호와 기초부터 시작하는 자바공부 4일차 예제 풀이 (0) | 2021.01.16 |
[JAVA]초보 개발자 김주호와 기초부터 시작하는 자바공부 3일차 예제 풀이 (0) | 2021.01.15 |
[JAVA]초보 개발자 김주호와 기초부터 시작하는 자바공부 3일차 (클래스(class), 상속(inheritance), 추상(abstract), Final) (0) | 2021.01.15 |
[JAVA]초보 개발자 김주호와 기초부터 시작하는 자바공부 2일차 예제 풀이 (0) | 2021.01.15 |