1. 상속
상속관계
- 기존의 클래스를 재사용하여 새로운 클래스를 작성
- 생성자와 초기화블럭은 상속되지 않는다. 멤버만 상속된다.
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
class Parent{ //조상클래스
int age;
}
class Child extends Parent { //자손클래스
void play() {
System.out.printkln("놀자~";
}
}
class grandChild extends Child {
int weight;
}
//Parent 클래스의 멤버는 age
//Child 클래스의 멤버는 age, play()
//greandChild 클래스의 멤버는 age, Play(), weight
class ParentTest {
public static void main(String args[]) {
Child cd = new Child();
cd.age = 10;
}
//자손클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성
포함관계
class Point {
int x, y; }
class Circle {
int x, y, r; } //일 경우,
class Circle {
Point c = new Point();
int r; } //로 쓸 수 있다.
단일상속
자바는 단일상속을 허용한다. 따라서 그 외는 포함(n개 가능)한다.
Object 클래스
- 모든 클래스의 조상
- toString(), equals()와 같은 기본적인 11개의 메서드가 정의되어있다.
2. 오버라이딩
- 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
- 선언부와 일치해야한다.
- 매개변수가 같아야한다.
- 반환타입이 같아야한다.
- 접근 제어자는 조상 클래스보다 좁게 할 수 없다.
- 조상 클래스의 메서드보다 많은 수의 예외 선언할 수 없다.
class Point {
int x,y;
String getLocation() {
return x + y;
}
}
class Point3D extends Point {
int z;
String getLocation() { //오버라이딩
return x + y + z;
//return super.getLocation() + z;
}
}
super, super()
- super : 조상의 멤버와 자신의 멤버를 구분할 때 사용한다.
- super() : 조상클래스의 생성자를 호출하는데 사용
class Point {
int x=10;
int y=20;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class Point3D extends Point {
int z;
Point3D() { //Point3D(int x, int y, int z)를 호출한다.
this(100,200,300);
}
Point3D(int x, int y, int z) {
super(x,y); //Point(int x, int y)를 호출한다. (조상의 초기화는 조상이한다)
this.z = z;
}
}
3. 제어자
- 제어자는 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
- 접근제어자는 한 번에 하나만 선택해서 사용할 수 있다.
접근제어자 : public, protected, (default), private
그 외: static, final, abstract, native, transient, synchronized, volatile, strictfp
static - 클래스의, 공통적인
final - 마지막의, 변경될 수 없는
abstract - 추상의, 미완성의
접근제어자
- 접근제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드, 생성자
접근제어자를 이용한 캡슐화
- 외부로부터 데이터를 보호하기 위해서
- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서
class Time {
private int hour,
Time(int hour) {
setHour(hour); //메서드호출 한 결과를 생성자 결과에 반환하게된다.
}
public int getHour () { return hour;) //겟터메서드
public void setHour(int hour) { //셋터메서드
if (hour < 0 || hour > 23) return;
this.hour = hour;
}
public class TimeTest{
public static void main(String args[]) {
Time t = new Time(12);
//t.hour = 13; //에러! 변수 hour의 접근 제어자가 ptivate이므로 접근할 수 없다.
t.setHour(t.getHour()+1); //현재시간보다 1시간 후로 변경한다.
- 자바빈 프로퍼티 규약 : 필드의 값을 직접 변경하지 않고, set..., get...라는 메서드를 통해 값을 읽거나 수정하는 자바내의 규칙
4. 다형성
- 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 한다.
- 반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.
참조변수의 형변환
class Car {
String color;
int door;
void drive() {
System.out.println("drive");
}
}
class FireEngine extends Car {
void water() {
System.out.println("water!");
}
}
class CastingTest1 {
public static void main(String args[]) {
Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;
car = (Car)fe; // FireEngine 인스턴스를 사용 가능
fe2 = (FireEngine)car; //자손타입 <- 조상타입
}
}
//결과적으로 fe, car, fe2 모두 같은 인스턴스 주소를 공유한다.
//car는 Car타입의 참조변수이기 때문에 water()를 호출할 수 없다.
instanceof 연산자
- 어떤 타입에 대한 instanceof 연산의 결과가 true라는 것은 검사한 타입으로 형변환이 가능하다는 것을 뜻한다.
class Car {
String color;
int door;
void drive() {
System.out.println("drive");
}
}
class FireEngine extends Car {
void water() {
System.out.println("water!");
}
}
class CastingTest1 {
public static void main(String args[]) {
Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;
car = (Car)fe; // FireEngine 인스턴스를 사용 가능
fe2 = (FireEngine)car; //자손타입 <- 조상타입
}
}
//결과적으로 fe, car, fe2 모두 같은 인스턴스 주소를 공유한다.
//car는 Car타입의 참조변수이기 때문에 water()를 호출할 수 없다.
5. 추상클래스와 추상메서드
- 추상클래스 : 추상메서드를 포함하고 있는 클래스
- 추상메서드 : 구현부가 없는 메서드 (미완성 메서드)
abstract class Unit { //추상클래스 (공통부분)
int x, y;
abstract void move(int x, int y); //추상메서드
void stop() {}
Unit(){
x = 10;
y = 20;
} //추상클래스도 생성자가 있어야한다.
}
class Marine extends Unit {
void move(int x, int y) {}//추상메서드 구현
void stimPack() {}
}
class Tank extends Unit {
void move(int x, int y) {}//추상메서드 구현
void chageMode() {}
}
6. 인터페이스
- 정의 : 추상메서드의 집합
- 모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.
- 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
- 인터페이스의 조상은 인터페이스만 가능
- 다중상속 가능
인터페이스의 장점
- 개발시간 단축
- 표준화 가능
- 서로 관계없는 클래스들에게 관계를 맺어줄 수 있음
- 독립적인 프로그래밍 가능
interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수목록);
}
인터페이스를 이용한 다형성
- 인터페이스의 참조변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.
- 인터페이스 타입의 매개변수가 갖는 의미는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야한다는 것이다.
- 리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다 .
interface Parseable{
public abstract void parse(String fileName);
}
class ParserManager { //리턴타입이 Parseable인터페이스이다.
public static Parseable getParser(String type) { //리턴타입이 인터페이스
if(type.equals("XML")){
return new XMLParser();
//리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을
//의미한다.
}else {
return new HTMLParser();
}
}
}
class XMLParser implements Parseable {
public void parse(String fileName) {}
}
class HTMLParser implements Parseable {
public void parse(String fileName) {}
}
class ParserTest {
public static void main(String args[]) {
Parseable parser = ParserManager.getParser("XML");
//인터페이스의 참조변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.
}
}
출저
도서 자바의 정석 (남궁성 강사님)
'JAVA' 카테고리의 다른 글
[JAVA] Call by Value & Call by Reference (0) | 2023.02.05 |
---|---|
[JAVA] 예외처리와 올바른 예외처리 방법 (0) | 2023.01.29 |
[JAVA] Object 클래스 - equals와 hashCode 함수 (0) | 2023.01.29 |
[JAVA] static에 대하여 (0) | 2023.01.29 |
[JAVA] 객체지향언어1 (0) | 2023.01.29 |