일단 해보는 코딩/Java

[Java] 접근제한자, 상속, 오버라이딩 예제 모음

eun_zoey2 2022. 7. 27. 15:49
728x90

 

오버라이딩, 오버로딩 참고  https://eun-s2.tistory.com/95

 

[Java] 가변인수, overloading, overriding

가변인수 메써드의 인자를 지정하지 않고 임의로 개수를 받아들이는 경우 class Test01 { int getMax(int x, int y) { //getMax( )에는 정수 x,y 두 개의 인자만 들어 올 수 있음 .......... } ex) class Test01 {..

eun-s2.tistory.com

기본 예제 모음

더보기

예제 1)

package Java08;
class Parent{
	// 아래의 2개 멤버 변수를 정의
	private int money = 200;
	private String str = "서울";
	// 아래의 4개 멤버 메써드를 정의
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money = money;	// parent 의 money 
	}
	public String getStr() {
		return str;
	}
	public void setStr(String str) {
		this.str = str;	// parent 의 str
	}
}	// 여기까지가 부모 클래스 정의 
class Child extends Parent {
	private String car = "Grandeur"; // 자식 클래스에서 하나의 변수 정의
	// 자식 클래스에서 두 개의 메써드 정의
	public String getCar() {
		return car;
	}
	public void setCar(String car) {
		this.car = car;
	}
}
public class Test01 {
	public static void main(String[] args) {
		Child cl = new Child(); //	Child 클래스에서 cl 객체 생성 (<=인스턴스화)
		System.out.println(cl.getCar()); // Child가 자신의 멤버 메써드 사용
		System.out.println(cl.getMoney());
		if(cl instanceof Parent) {	// instanceof 객체화 여부를 점검하는데 boolean으로 결과출력
			System.out.println("cl은 Parent의 자식이다.");
			System.out.println("-------------------");
			Child ch = new Child();	//Child 클래스에서 새로운 객체 생성
			Parent pr = new Parent();	//Parent 클래스에서 새로운 객체 생성
			pr=(Parent)ch;
			ch = (Child)pr; 
		// 자식을 부모에게 캐스팅(형변환)
		// 형변환의 이유:부모를 자식에 대입함으로써 자식은 자신의 모든 필드와 부모의 모든 필드 사용 가능
			System.out.println(ch.getCar());	// 자식이 자식 멤버 사용
			System.out.println(ch.getMoney());	// 자식이 부모 멤버 사용
			System.out.println(ch.getStr());	// 자식이 부모 멤버 사용
			System.out.println("-------------------");
			pr = ch;	// 자식을 부모에게 대입해도 부모는 자신의 멤버들만 사용가능
			System.out.println(pr.getMoney());	// 부모는 자신의 멤버만 사용가능
			//System.out.println(pr.getCar());	//부모는 자식 멤버 사용 불가능. 오류발생
			//System.out.println(Child)pr.getCar()); // 이것도 오류!
		}
	}
}

 

    예제 2)

다리 : 0 ...의문점;;
package Java08;
class Animal {	//동물이라는 큰 클래스를 부모로 정의해두고, 모든 자식 클래스들이 가질 수 있는 특성을 정의함
	int leg;
	String shout;
        public int getLeg() {
		return -1;	// overriding 을 위한 설정이지만 하는 일은 없다.
	}
	public String getShout() {
		return shout;
	}
	public void setShout(String shout) {
	this.shout = shout;
	}
}
class Duck extends Animal {
	private String wing = "날개가 있어요";
	public String getWing() {
		return wing;
	}
	public int getLeg() {
		System.out.println("Duck의 메써드 오버라이딩");	
		return 2; // 이 클래스에는 leg가 없지만 상속받았기 때문에 부모의 멤버 변수를 사용
		}
	}
class Ant extends Animal {
	private String legs = "다리가 많아요;;";
	public String getLegs() {
		return legs;	// 자신의 변수이므로 legs
  }

	public int getLeg() {	// 부모의 getLeg() 메써드를 가져와서 다음처럼 print하는 메써드 오버라이딩 
		//super.getLeg(); // 이런식으로 부모 멤버 매써드 호출 가능.
		System.out.println("Ant의 메써드 오버라이딩");
		return leg;	// 부모 변수이므로 leg
	}
}
public class Test02 {

	public static void main(String[] args) {
		Duck duck = new Duck();
		System.out.println("날개 : " + duck.getWing());	// 자식 메써드 이용
		System.out.println("다리 : " + duck.getLeg());	// 부모 메써드 이용
		duck.setShout("꽥꽥");
		System.out.println("울음소리 : " + duck.getShout());	// 부모 메써드 이용
		Ant ant = new Ant();
		System.out.println("다리 : " + ant.getLeg()); 	// 부모 메써드 이용
		System.out.println("다리 : " + ant.getLegs()); 	// 자식 메써드 이용
		ant.setShout("스물시물");
		System.out.println("울음소리 : " + ant.getShout());	// 부모 메써드 이용

	}
}

 

 

private 예제 모음

: 붙은 멤버_변수/멤버_메써드는 다른 오브젝트에서 사용할 수 없고, 서브 클래스로 상속 될 수도 없다.

더보기

예제 1)

package Java08;
class Person{
	private String name;	// ★외부에서 그냥 불러다 쓰지 못하고!!!!!★ 이 필드에 있는 메써드로 접근가능
	//String name; 			// 외부에서 그냥 불러다 사용 가능
	void setName(String n) {
		this.name = n;
	}
	String getName() {
		return name;
		}
	}
class Girl extends Person{
	void print () {
		System.out.println(getName() + "양");
		
	}
}

public class Test03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Girl names = new Girl();
		names.setName("나라");	 // 위에서 private로 했으면 부모 매써드를 호출해서 사용
		//nara.name="나라";		// 위에서 private로 하지 않으면 바로 접근가능
		names.print();			// 함수호출
		// print() 메써드를 호출하면 출력이 됨
	}
}

 

오버 라이딩 예제 모음 

더보기

Q1. Calculator 부모 클래스를 만들고 getResult() 메써드를 정의하고 반환형은 정수, 두개의 인자 n1, n2를 받게 하고 반환형은 -1(하는일 없음), 
이어서 CalPlus, CalMinus, CalMultiply, CalDivision 네 개의 자식 클래스를 생성해서 부모 클래스를 상속받게 하고, 오버라이딩을 이용해서 getResult() 메써드를 재정의하고, 인자로 받은 n1, n2를 각 자식에서 사칙연산으로 계산해서 결과를 보임

package Java08;

import java.util.Scanner;

class Calculator1{
	public int getResult(int n1, int n2) {
		return -1;
	}
}
class CalPlus1 extends Calculator {
	@Override
	// Annotation 은 CPU에게 다음 기술하는 부분
	public int getResult(int n1, int n2) {
		return n1+n2;
	}
}
class CalMinus1 extends Calculator {
	@Override
	public int getResult(int n1, int n2) {
		return n1-n2;
	}
}
class CalMultiply1 extends Calculator {
	@Override
	public int getResult(int n1, int n2) {
		return n1*n2;
	}
}
class CalDivision1 extends Calculator {
	@Override
	public int getResult(int n1, int n2) {
		return n1/n2;
	}
}

public class CalMain {

	public static void main(String[] args) {
		System.out.println("♥사칙연산 계산♥");
		System.out.println("---------------------");
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 숫자를 입력하세요 : ");
		int n1 =  sc.nextInt();
		System.out.print("두번째 숫자를 입력하세요 : ");
		int n2 = sc.nextInt();
		System.out.println("---------------------");
		
		CalPlus calPlus = new CalPlus();	// 각 클래스별로 객체 생성
		CalMinus calMinus = new CalMinus();
		CalMultiply calMultiply = new CalMultiply();
		CalDivision calDivision = new CalDivision();
		
		System.out.println("더하기(+) : " + calPlus.getResult(n1,n2));
		System.out.println("빼기(-) : " + calMinus.getResult(n1,n2));
		System.out.println("곱하기(*) : " + calMultiply.getResult(n1,n2));
		System.out.println("나누기(/) : " + calDivision.getResult(n1,n2));
		
		sc.close();
	}
	
}

Q2. Book 이라는 부모 클래스를 만들고 title, genre, printBook( )를 만들어서 제목과 장르만 인쇄시키고, Novel과 Magazine이라는 자식 클래스를 생성해서 Novel 에서 printBook( )을 불러서 저자를 인쇄시키고, Magazine에서 발행일을 인쇄시키고, main( )에서 novel 객체 생성 후  구운몽, 고전문학, 김만중을 출력하고, magazine 객체 생성 후 원간 자바, 프로그래밍, 20일 출간, 등이 나오게 해보시오.

package Java08;
class Book {	//super class
	String title;	//var field
	String genre;
	void printBook() {	// method field
		System.out.println("제목 : " + title);
		System.out.println("장르 : " + genre);
		}
	}
	class Novel extends Book  {
		String writer;
		void printNov() {
			//@Override
			printBook();
			System.out.println("저자 : " + writer);
		}
	}
	class Magazine extends Book  {
		int day;	// 자신의 변수 생성
		void printMag() {	// 자신의 메써드 생성
			//@Override
			printBook();	// 슈퍼클래스의 메써드를 불러서 사용
			System.out.println("발행일 : " + day + "일");
		}
	}
public class Q2 {

	public static void main(String[] args) {
		Novel nov = new Novel();
		nov.title ="구운몽";
		nov.genre ="고전문학";
		nov.writer ="김만중";
		
		Magazine mag = new Magazine();
		mag.title = "자바";
		mag.genre = "프로그래밍";
		mag.day = 20;
		
		nov.printNov();		// 함수 호출
		System.out.println("--------------------");
		mag.printMag();		// 함수 호출
		
	}

}

 

# 접근 제한자

제한자는 외부에서 해당 클래스에 접근할 수 있는 범위를 표시

 

final : 부모 클래스나 필드에 붙이면 상속을 못해주고 필드 값도 변경하지 못한다.

private : 부모 클래스에 붙이면 상속이 불가하고 다른 객체들이 사용할 수 없다. 클래스를 보호해서 보안과 캡슐화 할 때 사용한다.

protected :  부모 클래스에 붙이면 상속받은 클래스에서만 사용할 수 있다.

public : 부모 클래스에 붙이면 누구나 접속해서 이 클래스의 객체를 사용할 수 있다.

default : 클래스에 특별히 이런 접근 제한자를 붙이지 않으면 해당 클래스의 필드는 해당 패키지 안에서 사용된다.

 

this는 로컬변수나 매개변수에서 클래스 멤버에 name과 같은 변수가 있을 때 this.name식으로 해주면 해당 클래스의 변수를 지시한다. 즉, this는 클래스에 있는 멤버변수 등을 지시한다. 

 

# 추상 클래스와 추상 메써드

클래스에서 수행할 멤버 메써드들을 지정하지 않고 호출하는 방법만 기술한 메써드를 추상 메써드라고 하고, 추상 메써드를 가지고 있는 클래스를 추상 클래스라고 한다. abstract를 앞에 붙여서 표현한다.

프로그래밍을 강제할 때 사용, 기본적으로 지켜야 할 틀을 제공해서 각 서브 클래스에서 이 클래스를 불러서 구현시킬 때 사용된다. 

 

※ 갑분 용어정리

더보기

■ OOP(Object Oriented Programming : 객체지향언어 => Java , C++, ...)

클래스 개념을 사용해서 객체를 만들고 이 객체로 모든 현상을 설명하는 프로그래밍 기법 (Object는 최상위 객체)

★ 메써드 오버로딩(Overloading)

'동일한 이름'의 메써드를 다양한 방법으로 기술하는법.

하나의 메써드_명에 인자, 반환값만 다르게 해서 여러 개를 만들어두고 호출할 때 인자와 반환값에 맞는 메써드를 선택해서 사용하게 하는 기법

메써드 오버라이딩(Overriding)

부모 클래스의 멤버 메서드를 (상속받은) 자식 클래스에서 동일한 메써드 _명으로 내용만 다르게 해서 재지정하는 기법 (접근 범위는 보통 부모보다 넓게 잡아준다.)

Annotation

⇒ '@Override' 식으로 표기한 뒤 그 아래에 내용을 써주는데 '@내용' 은 일종의 주석과 같이 실제 실행되지는 않지만 그 아래의 내용을 프로세서에게 알려서 처리 속도를 빠르게 해준다. 메써드 오러라이딩을 표시하는데 처리 속도를 더 빠르게 해주기 위함이다.