본문 바로가기
프로그래밍 언어/자바

자바 클래스와 객체 #2

by 블루데이제이 2022. 9. 11.
728x90
반응형

클래스의 다양한 기능

지금부터는 클래스를 보다 효과적으로 사용하기 위한 클래스의 다양한 기능에 대해서 알아보도록 하겠습니다.
상속

노트북이라는 클래스가 필요하다고 가정하겠습니다. 노트북은 컴퓨터의 한 분류입니다. 노트북은 컴퓨터가 가진 특성외에 휴대성이라는 특성을 추가로 가지고 있습니다. 두 클래스 사이에 어떠한 포함 관계가 성립될 때 객체 지향의 상속 개념을 사용하면 클래스를 간단하게 만들 수 있습니다.

컴퓨터라는 클래스를 예를 들어 컴퓨터 클래스를 상속하여 노트북이라는 클래스를 만들 수 있습니다.

컴퓨터의 여러 특성이 있겠지만 여기에서는 컴퓨터명, 제조사, CPU, 메모리, 저장장치 종류만 예로 들겠습니다.

 

class Computer {
	private String name;
	private String maker;
	private String cpu;
	private String memory;
	private String hdd;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getMaker() {
		return maker;
	}
	public void setMaker(String maker) {
		this.maker = maker;
	}
	public String getCpu() {
		return cpu;
	}
	public void setCpu(String cpu) {
		this.cpu = cpu;
	}
	public String getMemory() {
		return memory;
	}
	public void setMemory(String memory) {
		this.memory = memory;
	}
	public String getHdd() {
		return hdd;
	}
	public void setHdd(String hdd) {
		this.hdd = hdd;
	}
	
}
class Notebook extends Computer{
	private boolean carry;

	public boolean isCarry() {
		return carry;
	}

	public void setCarry(boolean carry) {
		this.carry = carry;
	}
}

자바에서 상속개념을 사용할 때는 extends 라는 키워드를 사용합니다. 클래스의 선언부에 상속할 클래스를 extends 문 뒤에 입력하면 됩니다.

여기에서 중요한 포인트는 자바는 다중 상속을 지원하지 않습니다. 즉, 두 개 이상의 클래스를 동시에 상속받을 수 없습니다. 만일 다중 상속이 필요하다면 interface를 사용해 다중 상속의 기능을 만들 수 있습니다. interface는 추후 포스팅에서 언급하도록 하겠습니다.

노트북 클래스를 사용하는 예제 프로그램을 만들어 보도록 하겠습니다.

class MyComputer {
	public static void main(String[] args) {
		Notebook notebook = new Notebook();
		
		notebook.setName("Macbook Pro");
		notebook.setMaker("Apple");
		notebook.setCpu("Intel i9");
		notebook.setMemory("16GB");
		notebook.setHdd("SSD 512GB");
		notebook.setCarry(true);
		
		System.out.println("컴퓨터 명 : " + notebook.getName());
		System.out.println("제조사 : " + notebook.getMaker());
		System.out.println("CPU : " + notebook.getCpu());
		System.out.println("Memory : " + notebook.getMemory());
		System.out.println("저장장치 : " + notebook.getHdd());
		
		if(notebook.isCarry()) {
			System.out.println("휴대여부 : 휴대 가능");
		}else {
			System.out.println("휴대여부 : 휴대 불가능");
		}
		
	}
}

노트북 클래스가 컴퓨터 클래스를 상속받았기 때문에 컴퓨터 클래스의 변수와 메소드를 사용할 수 있습니다.

MyComputer 클래스를 생성하고 아래의 소스 코드를 입력합니다.

class MyComputer {
	public static void main(String[] args) {
		Notebook notebook = new Notebook();
		
		notebook.setName("Macbook Pro");
		notebook.setMaker("Apple");
		notebook.setCpu("Intel i9");
		notebook.setMemory("16GB");
		notebook.setHdd("SSD 512GB");
		notebook.setCarry(true);
		
		System.out.println("컴퓨터 명 : " + notebook.getName());
		System.out.println("제조사 : " + notebook.getMaker());
		System.out.println("CPU : " + notebook.getCpu());
		System.out.println("Memory : " + notebook.getMemory());
		System.out.println("저장장치 : " + notebook.getHdd());
		
		if(notebook.isCarry()) {
			System.out.println("휴대여부 : 휴대 가능");
		}else {
			System.out.println("휴대여부 : 휴대 불가능");
		}
		
	}
}

오버라이딩

클래스에서 상속을 하면 하위 클래스는 상위 클래스에서 사용하는 변수나 메소드를 다시 만들지 않고도 사용할 수 있습니다. 하지만 하위 클래스에서 상위 클래스에서 사용하는 같은 이름의 메소를 사용하고 할 경우가 있습니다. 하위 클래스에서 메소드를 구현하면 됩니다.

상위 클래스의 메소드를 하위 클래스에서 다시 구현하는 것을 메소드 오버라이딩(Overring)이라고 합니다.

class Notebook extends Computer{
	private boolean carry;

	public boolean isCarry() {
		return carry;
	}

	public void setCarry(boolean carry) {
		this.carry = carry;
	}
	
	@Override
	public String getName() {
		return "노트북명 : " + super.getName();
	}
}

노트북 클래스에 소스 코드처럼 메소드를 추가합니다. 메소드의 @Override는 넣어도 되고 안 넣어도 됩니다. 필자는 오버라이드 된 메소드라는 것을 명시하기 위해 넣어 줍니다.

그리고 나서 MyCompter를 실행하면 아래와 같이 실행결과를 볼 수 있습니다.

 

 

중요포인트

오버라이딩 시 메소드의 이름 뿐 아니라 메소드의 리턴형과 전달인자도 같아야 합니다.

this와 super

오버라이딩 프로그램밍에서 상위 클래스에 있는 본래의 메소드나 변수를 사용하고 싶을 때가 있습니다.

이럴 때 사용하는 것이 super라는 키워드입니다. 즉, super는 상위 클래스의 객체를 가리키는 레퍼런스입니다.

super 레퍼런스와 비교되는 것이 this 레퍼런스입니다. super는 상위 클래스의 객체를 가리키고 this는 자기 자신을 가리키는 레퍼런스입니다.

 

class A{
	protected String name = "블루데이제이";
}

class B extends A{
	private String name = "BLUEDAYJ";

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public String getOriginalName() {
		return super.name;
	}
	
	
}


class Super {
	public static void main(String[] args) {
		B b = new B();
		
		System.out.println("오버라이딩 전 : " + b.getOriginalName());
		System.out.println("오버라이딩 후 : " + b.getName());
	}
}

소스 코드를 보시면 getOriginalName메소드의 super.name은 B클래스의 name 변수가 아닌 A클래스의 name 변수를 가리키는 것입니다.

오버로딩

클래스는 메소드 오버로딩(Overloading)이라는 기능을 지원합니다. 앞의 오버라이딩과 이름이 비슷하므로 주의하길 바랍니다. 간단히 말하자면 오버로딩이란 같은 이름의 메소드를 여러 개 생성할 수 있습니다.

public String getName()
public String getName(String userId)
public String getName(int userNumber)

중요포인트

메소드 인자의 타입이 다르거나 인자의 수를 다르게 정의하면 같은 이름의 메소드를 클래스에서 사용할 수 있습니다. 단, 메소드의 리턴형은 반드시 같아야 합니다.

728x90
반응형

'프로그래밍 언어 > 자바' 카테고리의 다른 글

자바 클래스와 객체 #4  (0) 2022.09.11
자바 클래스와 객체 #3  (0) 2022.09.11
자바 클래스와 객체 #1  (0) 2022.09.11
[자바] for문을 이용한 삼각형 만들기  (0) 2022.09.09
[자바] 구구단 만들기  (0) 2022.09.09