Java day 11

유요한·2022년 11월 23일
1

Java

목록 보기
11/24
post-thumbnail

객체지향 언어

객체지향언어는 기존의 프로그래밍언어에 몇 가지 새로운 규칙을 추가한 보다 발전된 형태의 것이다. 이러한 규칙들을 이용해서 코드 간에 서로 관계를 맺어 줌으로써 보다 유기적으로 프로그램을 구성하는 것이 가능해졌다.

  • 객체지향 언어의 특징
  1. 코드의 재사용성이 높다.
    새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
  2. 코드의 관리가 용이하다.
    코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
  3. 신뢰성이 높은 프로그래밍을 가능하게 한다.
    제어자와 메소드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하여 코드의 중복을 줄여서 코드의 불일치로 인한 오류를 방지할 수 있다.

객체지향 언어의 장점
코드의 재사용성이 높고 유지보수가 용이하다


객체지향 프로그래밍(OOP : Object Oriented Programming)

부품에 해당되는 객체들을 먼저 만들고 하나씩 조립해서 완성된 소프트웨어를 만드는 기법

상속(Inheritance)

  • 부모 클래스로부터 속성을 물려받아 태어난 자식 클래스
  • 부모의 모든 변수와 메소드를 물려받아 사용할 수 있다.
    단, 접근지정자에 따라 접근 허용이 제한된다.
  • 자바는 다중 상속을 허용하지 않지만 여러 자식 클래스에서 상속 가능

상속 문법

extends 키워드 뒤에는 하나의 부모 클래스만 와야한다.

	class SuperCar extends Car {
	→ 이 상태는 Car을 상속해줄게 라는 약속만 한 상태 
	아직 빈 필드만 가지고 있음
	class A {
	A의 필드
}
class B extends A {
	B의 필드
}
	B b = new B();
	b 객체는 실제로는 A의 필드와 B의 필드 둘 다 가지고 있다.

A : 부모 클래스, 상위 클래스, 슈퍼 클래스, 기반 클래스
B : 자식 클래스, 하위 클래스, 서브 클래스, 파생 클래스

부모 클래스

  • 클래스를 만들때부터 부모 클래스를 고려한 경우
    추상적인 개념에서 접근하여 클래스를 설계한다.
    ex) 나에 대한 부모 클래스의 추상적인 개념은 '인간'

자식 클래스

  • 부모를 선택하여 자식 클래스를 만든다.
  • 부모를 클래스에 자신만의 특성(변수, 함수(메소드))를 추가한다.
  • 기본적인 부모의 모든 것을 물려받는다.
    → 자신이 만든 부모 클래스도 Object(시초) class에 상속받는다.
  • 접근지정자에 따라 접근이 제한되는 것도 있다.
    (private, protected, public, default)

자식 클래스의 생성자 호출 시 일어나는 일

자식 클래스의 객체는 자식 생성자를 호출하여 객체화를 진행한다.
자식 생성자를 호출했으므로 자식 클래스의 필드가 메모리에 올라갈 것이다.

메모리에 자식 클래스의 필드만 올라갔다면 자식 객체로 절대 부모 클래스에 있는 필드에 접근할 수 없다. 따라서 자식 생성자를 호출하게 되면 자식 클래스가 상속받기로 약속되어 있는 부모 클래스의 생성자가 자동으로 먼저 호출이 된다. 그 이후에 자식 클래스의 필드가 부모 클래스의 필드에 이어붙어서 객체의 필드가 완성되게 된다. 따라서 자식 클래스로 만든 객체는 부모 필드가 먼저 메모리에 생성되어 있기 때문에 가능해진다.
→ 자식 생성자의 첫 줄에는 항상 super클래스의 생성자가 호출된다.
명시적으로 적지 않을시에는 보이진 않지만 super() 호출 = 부모의 기본 생성자를 호출

단축키 :
Alt + Shift + s → c : 부모 클래스의 생성자 받아와서 생성자 만들기
Alt + Shift + s → o : 자신이 만든 인스턴스 변수(필드)를 토대로 생성자를 만듬

	// 첫번째
// 상속을 위해서 만든 것
// 맥주 상위(부모)클래스
public class Beer {
	String type;
	String model;
	
	public Beer(String type, String model) {
		this.type = type;
		this.model = model;
	}
	public void drink() {
		System.out.println("마십니다.");
	}
	public void mix() {
		System.out.println("섞습니다.");
	}
	
	// 하위 클래스에서 사용하기 위해 Get도 만들어준다.
	public String getType() {
		return type;
	}
	public String getModel() {
		return model;
	}

// 두번째
// 하위(자식) 클래스
public class Hoegaarden extends Beer {
// 필드 입력
String flavor;
int ABV = 6;

Hoegaarden(String model, String flavor) {
	super("밀 맥주", model);
	this.model = model;			// model은 상위 Beer 클래스로부터 상속받음
	this.flavor = flavor;
}

Hoegaarden(String model, String flavor, int ABV) {
	super("밀맥주", model);
	this.model = model;			// model은 상위 Beer 클래스로부터 상속받음
	this.flavor = flavor;
	this.ABV = ABV;
}

// 메소드 입력
public void flavorDrink() {
	System.out.println(model + "맥주의 "+flavor+ "맛을 마십니다.");
}

// Getter
public String getFlavor() {
	return flavor;
}
public int getABV() {
	return ABV;
}

}

public class HoegaarenBeerExample {

// 3번째 상속 출력하기
public static void main(String[] args) {
	// 호가든 맥주 레몬맛 객체 생성하기
	Hoegaarden holemon = new Hoegaarden("호가든","레몬", 3);
	
	// Beer 클래스로 부터 상속받은 필드
	System.out.println("타입 : " + holemon.getType());
	System.out.println("알콜 도수 : "+ holemon.getABV());
	
	// Hoegaarden 클래스로부터 상속받은 필드
	System.out.println("맛 : " + holemon.getFlavor());
	
	// Hoegaarden 클래스 메서드 호출
	holemon.flavorDrink();	
}	

}

profile
발전하기 위한 공부

0개의 댓글