2022.11.21 JAVA 18일차 오버라이딩, 접근제어자

2022. 11. 22. 15:43JAVA

 

오버라이딩

조상 클래스로 부터 상속받은 메서드의 내용을 변경하는 것

자손클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와
-이름이 같아야 한다.
-매개변수가 같아야 한다.
-반환타입이 같아야 한다.

 

오버라이딩 메서드 호출 시 자식메서드 우선


부모 클래스

class Point{
int x;
int y;
    String getLocation(){
    return "x : " + x + ", y : " + y;
    }
}

자식 클래스

class Point3D extends Point{
int z;
    String getLocation(){
    return "x : " + x + ", y : " + y + ", z : " + z;
    }
}

 

class Point1
{
	int x;
	int y;
	
	String getLocation()
	{
		return "x : " + x + ", y: " + y;
	}
}

class Point3D extends Point1
{
	int z;
	
	String getLocation()
	{
		return "x : " + x + ", y : " + y + ", z : " + z;
	}
}

public class PointSample {

	public static void main(String[] args) {
		//오버라이딩
		
		Point3D p3 = new Point3D();
		
		p3.x = 10;
		p3.y = 20;
		p3.z = 30;
		
		System.out.println(p3.getLocation());
	}

}

출력



접근제어자 

맴버 또는 클래스의 사용되어 해당하는 맴버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할

private : 같은 클래스 내에서만 접근가능
default : 같은 패키지 내에서만 접근가능 (접근제어자를 따로 설정안해놓으면 기본적으로 default로 설정)
protected : 같은 패키지 내에서와 다른 패키지의 자손 클래스에서 접근가능
public : 접근제한 없음


대상에 따라 사용할 수 있는 접근 제어자
클래스 : public, (default)
메서드    : public, protected,(default), private
멤버변수 : public, protected,(default), private
지역변수 : 없음

접근 제어자 사용이유
- 외부로 부터 데이터 보호
- 내부적으로 사용되는 부분을 감추기 위해

import java.util.*;

class Person3
{
	private String name;
	private int age;
	private String job;
	Scanner sc = new Scanner(System.in);
	Person3()
	{
		this(" " , 0 , " ");
	}
	
	Person3(String name, int age, String job)
	{
		this.name = name;
		this.age = age;
		this.job = job;
	}

	public String getName() {
		return name;
	}

	public void setName() {
		String name = sc.next();
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge() {
		int age = sc.nextInt();
		this.age = age;
	}

	public String getJob() {
		return job;
	}

	public void setJob() {
		String job = sc.next();
		this.job = job;
	}
	
	public String toString()
	{
		return name + "님의 나이는 " + age + "살이며, 직업은 " + job + "입니다.";
	}
	
	public boolean nameEquals()
	{
		if(getName().equals("끝"))
		{
			System.out.println("프로그램을 종료합니다.");
			return false;
		}
		return true;
	}
	
}

public class MySample1121_4 {

	public static void main(String[] args) {
		/*
		 * 이름, 나이, 직업을 입력받아 입력받은 값을 화면에 출력하며, 이름에 "끝"이 입력되면 종료되는 프로그램 작성
		 * 입력예)
		 * 이름은>홍길동
		 * 나이는>22
		 * 직업은>프로그래머
		 * 
		 * 출력예)
		 * 홍길동님의 나이는 22살이며, 직업은 프로그래머 입니다.
		 * 
		 * 입력예)
		 * 이름은>끝
		 * 나이는>25
		 * 직업은>백수
		 * 
		 * 출력예)
		 * 프로그램은 종료합니다.
		 */
		Person3 p = new Person3();
		
		
		while(true)
		{
			System.out.print("이름은>");
//			p.name = "홍길동";			// private 접근제어자가 붙은 변수는 다른 클래스에서 직접 변경이 불가능 하다
			p.setName();
			System.out.print("나이는>");
			p.setAge();
			System.out.print("직업은>");
			p.setJob();
			
			if(!p.nameEquals())
			break;
			
			
			System.out.println(p);
			
		}	
	}

}

출력