JAVA

[JAVA] 객체지향언어2

날아 2023. 1. 29. 20:27

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"); 
			//인터페이스의 참조변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다. 
	}
}

 

 

 

출저

도서 자바의 정석 (남궁성 강사님)