728x90
1. 추상 클래스
- 클래스 선언시 abstract class로 정의
- 추상 메소드를 하나 이상 포함
- 추상 메소드는 선언만하고 구현하지 않은 메소드로 정의
- 추상 메소드를 포함하는 상위 클래스는 객체 생성 불가
- 하위 클래스에서 상속 받은 모든 추상 메소드를 구현하면 객체 생성 가능
- 추상 메소드를 모두 구현하지 않을 경우, 하위 클래스도 모두 추상 클래스
- 하위 클래스에 기본 틀을 제공
1.1. 예시) 추상 클래스의 추상 메소드를 상속 받은 하위 클래스에서 구현하여 메소드 사용
// 부모 추상 클래스
package model;
public abstract class GrandParent {
// 추상클래스는
// 메소드를 만드는데 메소드의 이름만있고
// 내용은 아직 정해지지 않앗다.
String name;
int age;
public abstract void print();
public int future() {
return age + 20;
}
public abstract void hello();
}
// 자식클래스
package model;
public class Parent extends GrandParent {
String job;
public Parent(String name, int age, String job) {
// TODO Auto-generated constructor stub
this.name = name;
this.age = age;
this.job = job;
}
@Override
public void print() {
// TODO Auto-generated method stub
System.out.println(name+" "+age+" "+job);
}
@Override
public void hello() {
// TODO Auto-generated method stub
System.out.println("Hello~~!");
}
}
// 메인 클래스
package main;
import model.GrandParent;
import model.Parent;
public class GrandMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Parent p = new Parent("홍길동",50,"개발자");
p.print();
System.out.println(p.future());
p.hello();
}
}
1. 인터페이스 (Interface)
- 추상 메소드와 상수로만 구성된 특수 형태의 클래스
- 상수란 값을 한번 설정하면 다시 바꿀 수 없는 변수
- 인터페이스 선언시 class가 아닌 interface로 정의
- 클래스의 상속은 extends를 쓰지만 인터페이스의 상속은 implements를 사용
- 모듈들을 연결하는 기능
2. 인터페이스의 사용 이유
- 프로그램이 실행되는 환경은 매우 다양
- 개발 할 때 실행 될 환경을 고려하지만 모든 환경을 만족시킬 수 없음
- 서로 다른 환경에서의 기능 구현은 프로그램의 유지 보수성 저하
- 그렇기 때문에 부품 교체하듯 코드의 일부를 교체하는 것이 효과적
- 내부 구현은 다르지만 인터페이스로 사용 방법을 동일하게 제공하면 환경 변화에 따른 수정이 훨씬 쉬움
- 주로 API에서 많이 사용
예) DB프로그램은 오라클,MS-SQL,MySQL 등 다양하며 서로 처리 방법이 다르다.
DB프로그램이 바뀔 때마다 코드를 수정해야하지만 인터페이스로 설정해두면 수정을 쉽게 할 수 있다.
Card.java
package model;
public interface Card {
// interface는 클래스가 아니다.
// interface는 멤버변수가 없다.
// 단, constant (상수)와 Static변수는 가능!!
// 상수란?? 변수 비슷하지만 한 번 데이터를 저장하면
// 값을 바꿀 수 없는 것!
// 상수는 메모리의 데이터영역에 저장된다.
// 상수 => static final 키워드가 있어야한다.
public static final int CLOVER = 1;
public static final int HEART = 2;
public static final int DIAMOND = 3;
public static final int SPADE = 4;
public String getCardNumber();
public void print();
}
MyCard.java
package model;
public class MyCard implements Card, Player {
public String cardNumber;
public static final String HOST_NAME ="https://naver.com";
@Override
public String getCardNumber() {
// TODO Auto-generated method stub
return cardNumber;
}
@Override
public void print() {
// TODO Auto-generated method stub
System.out.println("내 카드 숫자는 : "+cardNumber);
}
@Override
public void play(String name) {
// TODO Auto-generated method stub
}
@Override
public void end() {
// TODO Auto-generated method stub
}
}
Player.java
package model;
public interface Player {
public void play(String name);
public void end();
}
InterfaceMain.java
package main;
import model.MyCard;
public class InterfaceMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyCard card = new MyCard();
card.cardNumber="7";
String number = card.getCardNumber();
System.out.println(number);
card.print();
System.out.println(card.CLOVER);
// 클로버는 상수이므로 (static final) 값 변경이 안 된다.
// card.CLOVER=10;
// 상수는 언제 사용할까?
// DB HOST, DB 유저이름 등등..
System.out.println(card.HOST_NAME);
// 상수는 메모리의 데이터 영역에 있다.
// 따라서 위처럼 객체를 갖고 사용해도 되지만,
// 실제로는 객체 생성 없이 사용이 가능한 것이 바로 상수다!
// 따라서 정석 사용법은 객체 생성없이 클래스,인터페이스의
// 이름.상수명 => 이렇게 사용한다.
System.out.println(MyCard.HOST_NAME);
System.out.println(MyCard.SPADE);
}
}
'Java' 카테고리의 다른 글
Java - ArrayList와 HashMap / size(), set(), remove(), clear(), isEmpty,put(),replace(), (0) | 2023.01.25 |
---|---|
Java - 정수 및 실수를 클래스로 생성하는 방법 / 문자열 형변환 / 문자열 함수 (0) | 2023.01.25 |
Java - 상속 (Inheritance) / 메소드 오버라이딩 (Method Overriding) / super (0) | 2023.01.19 |
Java - 접근제어자 / this / getter setter (0) | 2023.01.19 |
Java - 생성자(Constructor) , 생성자 오버로딩 (0) | 2023.01.19 |