추상 클래스와 인터페이스
클래스 : 객체 설계도 [ 필드, 메서드]
추상클래스 : 규약. 일반화한 공통필드, 스스로 객체회 못함, 자식클래스에게 물려주는 용도로만 사용. 추상메서드는 자식에서 반드시 구현해야함.
인터페이스: 규약. 반드시 추상메서드 보유.
추상 클래스와 인터페이스 모두 규약으로서의 의미가 강하지만
추상 클래스는 객체를 일반화한 공통 필드와 메서드의 정의에 집중 (종적 확장) -> 상속관계집중
인터페이스는 자연스러운 상속 관계를 해치지 않으면서도 추가 내용을 규정할 수 있음(횡적 확장)
정리 예제
(추상) 애니멀 만들기 Abstract
- 상속하여 Human , Panda 생성
- (인터페이스) Kunfu Skill
- (I) Fly
TheOne extends Animal implements Kungfuskill, fly
Kunfupanda extends Aninmal implements Kungfuskill
SummarayApp - main
1. 최상위 부모 Class Animal
package com.javaex.oop.summary;
public abstract class Animal {
// 필드
protected String name;
protected int age;
// 생성자
public Animal(String name) {
super();
this.name = name;
}
public Animal(String name, int age) {
this(name);
this.age = age;
}
// 일반 메서드
public void eat() {
System.out.printf("%s is eatiing...%n", this.name);
}
public abstract void say();
}
- 일반메서드 eat과 추상메서드 say가 있음.
2. Animal을 상속받은 Class 2개 /
2-1. Human
package com.javaex.oop.summary;
public class Human extends Animal {
// 생성자가 아무것도 없으면 기본 생성자를 만들고, 상속받았으면 부모 생성자를 호출
// 생성자 만들어주기
public Human(String name, int age) {
// 명시적으로 부모 생성자 호출
super(name, age);
}
@Override // 메서드 덮어쓰기
public void say() {
// animal class에 있는 추상 메서드
System.out.printf("Hello, I`m %s.%n", this.name);
}
}
부모 Animal의 추상메서드 Say를 구체화
2-2. Panda
package com.javaex.oop.summary;
public interface KungfuSkill {
// 추상메서드 , Interface라 abstract 안붙임
public void kungfu();
}
3-2. 날다 Flyalbe
package com.javaex.oop.summary;
public interface Flyable {
public void fly();
}
4. 상속과 스킬을 결합한 존재 만들기
4-1. 쿵푸판다
package com.javaex.oop.summary;
public class KungfuPanda extends Panda implements KungfuSkill {
public KungfuPanda(String name, int age) {
super(name, age);
}
@Override
public void kungfu() {
System.out.printf("%s : 아뵤뵤뵤뵤%n", this.name);
// TODO Auto-generated method stub
}
}
판다를 상속하고, 쿵푸 스킬을 참조함.
인터페이스 쿵푸스킬에 있는 추상화 메서드를 구체화.
쿵푸가 실행되면 아뵤뵤뵤뵤뵤 실행
4-2. 네오 만들기
매트릭스의 네오는 쿵푸도 하고 날수도 있다
인간 클래스를 상속하고, 쿵푸 기술과 나는 기술을 넣어보자.
package com.javaex.oop.summary;
public class TheOne extends Human implements Flyable, KungfuSkill {
public TheOne(String name, int age) {
super(name, age);
}
@Override
public void kungfu() {
System.out.printf("%s : I know Kungfu%n", this.name);
}
@Override
public void fly() {
System.out.printf("%s : I can fly!%n", this.name);
}
}
@Override를 넣어주는것이 포인트. 기존 메서드를 덮어씌운다.
5. 실행해보기
package com.javaex.oop.summary;
public class SummaryApp {
public static void main(String[] args) {
// TODO Auto-generated method stub
Human h1 = new Human("Jaemin", 30);
Human h2 = new TheOne("Neo", 99);
Panda p1 = new Panda("Pang", 5);
Panda p2 = new KungfuPanda("Pho", 20);
h1.eat(); // Animal 일반 메서드
h1.say(); // Animal 추상메서드 -> 자식클래스애서 override
fight(h1);
fly(h1);
System.out.println();
p1.eat();
p1.say();
fight(p1);
fly(p1);
System.out.println();
p2.eat();
p2.say();
fight(p2);
fly(p2);
System.out.println();
h2.say();
h2.eat();
fight(h2);
fly(h2);
}
private static void fight(Animal actor) {
// actor가 KungfuSkill 인터페이스를 구현?
if (actor instanceof KungfuSkill) {
// KungFuSkill로 다운캐스팅 가능
((KungfuSkill) actor).kungfu();
} else {
// KungFuskill 이 없어서 캐스팅 불가
System.out.printf("%s(%d) 쿵푸못해여....%n", actor.name, actor.age);
}
}
private static void fly(Animal actor) {
if (actor instanceof Flyable) {
((Flyable) actor).fly();
} else {
System.out.printf("%s(%d) 못날아여.....%n", actor.name, actor.age);
}
}
}
fight 와 fly 메서드를 추가했다.
만약 불러온 인스턴스가 쿵푸스킬이 있을경우, 쿵푸클래스로 다운그레이드 해서 기능을 사용한다 라는 내용.
결과는 다음과 같다.
Jaemin is eatiing...
Hello, I`m Jaemin.
Jaemin(30) 쿵푸못해여....
Jaemin(30) 못날아여.....
Pang is eatiing...
Pang: ???????
Pang(5) 쿵푸못해여....
Pang(5) 못날아여.....
Pho is eatiing...
Pho: ???????
Pho : 아뵤뵤뵤뵤
Pho(20) 못날아여.....
Hello, I`m Neo.
Neo is eatiing...
Neo : I know Kungfu
Neo : I can fly!
예외 처리
예외 (Exception)
프로그램이 실행되는 동안 발생할 수 있는 비정상적인 상태
컴파일시의 에러가 아닌 실행시의 에러를 예외라 함
자바의 예외 처리
Exception 클래스 정의 ( 모든 예외의 부모클래스)
기본적인 예외는 자바에 미리 정의된 예외를 통해 처리 가능
사용자가 필요한 예외를 직접 정의할 수 있음
예상되는 예외는 미리 처리해주면 비정상적인 프로그램의 종료를 피할 수 있음
예외처리는 프로그램의 신뢰도를 높여줌
try ~ catch ~ finally
try 블록에서 예외가 발생했을 경우 : 0 -> 1 -> 2 -> 3 -> 4
try 블록에서 예외가 발생하지 않았을 경우 : 0 -> 1 -> 3 -> 4
Exception Class
예외 (Exception)의 구분
- Checked Exception : 컴파일할 때 확인되는 예외 -> 반드시 예외 처리가 필요함
- Unchecked Exception : 실행 시점에서 확인되는 예외 -> 예외 처리 없어도 컴파일 됨
예외 처리가 필요한 시점
1. 파일을 다루는 경우
- 파일이 없거나 다른 프로세스에 의해 사용중인 경우 예외 발생
2. 입출력을 다루는 경우
- 이미 닫힌 입출력 스트림에 대해 작업하려 할 경우 예외 발생
3. 네트워크를 이용한 데이터 통신
- 서버나 클라이언트 한 쪽에서 응답이 없는 경우
- 네트워크 상태가 좋지 않아 정해진 시간 동안 데이터를 받지 못하는 경우
메서드 정의시 예외 처리
- 해당 메서드를 호출하는 메서드에서 예외를 처리하도록 명시한다
- throws 키워드를 사용하여 예외의 종류를 적어준다
JAVA API
ava.lang
자바 프로그램에서 가장 많이 사용하는 패키지
import 하지 않아도 자동으로 포함됨
Object 클래스
모든 클래스의 최상위 클래스
명시적으로 extends java.lang.Object 하지 않아도 자동으로 상속받게 된다
Object 클래스 toString() 메서드 오버라이드
toString() : 객체의 정보를 문자열로 반환
Object의 toString :
getClass().getName() + “@” + Integer.toHexString(hashCode())
equals()
두 객체의 비교시 == 와 Object 클래스의equals() 메서드를 사용한다
== 와 equals()의 차이 : 확실히 구분하여 사용
== 참조변수값 비교
equals() : 정의한 값 비교
참조 변수값을 먼저 비교한다
참조변수값이 같으면 두 객체는 같은 것으로 한다
참조변수값이 다르면 두 객체의 속성값을 비교한다
package com.javaex.api.objectclass.v1;
public class LangClassTest {
public static void main(String[] args) {
Point p = new Point(2, 3);
// point는 object클래스의 모든 메서드를 사용 가능하다.
System.out.println(p.getClass().getSimpleName());
System.out.println(p.hashCode());
System.out.println(p.toString()); // com.javaex.api.objectclass.v1.Point@5aaa6d82
System.out.println(p);
// p의 부모 확인
System.out.println("P의 부모:" + p.getClass().getSuperclass().getName());
}
}
일반적인 상황에서 좌표를 찍고, toSting을 하게되면 해시태그에 대한 값을 나오게된다.
이때 toSting 함수를 넣었을때, 다른 결과값을 받고 싶다면 아래와 같이 오버라이딩 한다.
package com.javaex.api.objectclass.v1;
// v1. 모든 class의 최상위 부모는 Object 이다.
//public class Point extends java.lang.Object{
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return String.format("Point(%d,%d)", x, y);
}
}
결과
Point
1521118594
Point(2,3)
Point(2,3)
P의 부모:java.lang.Object
같은 내용으로 아래와 같이도 할수 있다.
package com.javaex.api.practice;
public class CircleApp {
public static void main(String[] args) {
Circle a = new Circle(6, 4, 10);
Circle b = new Circle(2, 12, 10);
Circle c = new Circle(3, 3, 12);
Circle d = c;
System.out.println(a.equals(b));
System.out.println(a.equals(c));
System.out.println(a.equals(d));
System.out.println(d.equals(c));
}
}
원의 위치와 반지름이 주어지고, 반지름이 같으면 두개의 객체는 같다. 라고 표현하려고 한다.
package com.javaex.api.practice;
public class Circle {
private int x;
private int y;
private int radius;
public Circle(int x, int y, int radius) {
this.x = x;
this.y = y;
this.radius = radius;
}
// 두 객체의 반지름이 같으면 객체가 동일한 것으로 설정
@Override
public boolean equals(Object obj) {
if (obj instanceof Circle) {
Circle other = (Circle) obj;
return radius == other.radius ;
}
return super.equals(obj);
}
}
이클립스 tip
이클립스에서 소스코드 우클릭 -> source -> Generate toString() 을 선택하면
@Override public String toString() { return "Rectangle [width=" + width + ", height=" + height + ", area=" + area + "]"; }
귀찮은것을 한방에 만들어준다.
같은방법으로 source -> Ovverride/Implement Methods를 선택하면, 오버라이드를 할 수 있다.
오버라이드 할 메소드를 선택하고 OK를 누르면
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return super.equals(obj);
}
요로코롬 생긴다.
'JAVA' 카테고리의 다른 글
Java Utility API / Geniric / Collection Framework (0) | 2021.08.11 |
---|---|
JAVA API, Stirng, StringBuffer, Arra (0) | 2021.08.11 |
JAVA 변수 / 패키지 / 상속 (0) | 2021.08.11 |
JAVA 객체지향 프로그래밍 /클래스 / 메서드 (0) | 2021.08.11 |
JAVA 참조타입 / 배열 / jar (0) | 2021.08.11 |