JAVA/강의

JAVA 11일차 강의 - 캡슐화와 상속

record2080 2025. 1. 30. 23:52

10일은 발표날;;

<캡슐화> : 객체의 외부인 메인에서 너무 쉽게 접근이 가능하기 때문에 캡슐화가 필요함

즉,외부에서 내부를 건드리지 못하게 하는 것

private : 하이딩 /나만 쓸 수 있음/ 메인에서는 쓸 수 없음

class Student {
	private String name; // 접근자, 접근제한자
	private int score;
	Student(String name,int score) {
		this.name=name;
		this.score=score;
	}
	// 캡슐화된 멤버변수의 값을 가져오고싶을때 == getter
	public String getName() { // getXxx()
		return this.name;
	}
	public int getScore() {
		return this.score;
	}
	// 캡슐화된 멤버변수에게 새로운 값을 부여하고싶을때 == setter
	public void setName(String name) {
		this.name=name;
	}
	public void setScore(int score) {
		this.score=score;
	}
}
public class Test01 {
	public static void main(String[] args) {
		
		Student s1=new Student("티모",50);
		Student s2=new Student("모르가나",80);
		
		//System.out.println(s2.score);
		System.out.println(s2.getScore());
		
		//s1.score=81;
		s1.setScore(81);
		
	}
}

 

 

참고 ) 소스에 겟터/셋터 있음

생성자함수랑 비슷한 형태

getter : 파라미터 갖고 올 떄

setter : 내 값을 셋팅할 때 (고정)


<상속> : 자바는 다중상속이 되지 않는다(부모는 하나)

상속을 잘 쓰면 확장 개발에 용이하다

class Animal { // 상위 클래스, 부모 클래스
	private String name; /// protected
	private String type;
	void hello() {
		System.out.println("멍멍!");
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
}
class Dog extends Animal { // 하위 클래스, 자식 클래스, 파생 클래스
	void play() {
		System.out.println("scroll");
	}
}
class Cat extends Animal {
	void sleep() {
		System.out.println("zzz.......");
	}
}

public class Test03 {
	public static void main(String[] args) {
		Dog dog=new Dog();
	}
}

참고)  protectecd 

- 내 자식까지는 쓸수 있게 해줌
 -실무에서는 잘 쓰지 않음
 -가리려면 확실히 가리고 오픈할 거면 오픈해라(private/public)

 

★중요 

//부모클래스에서 에러가 생기면 자식클래스에도 문제가 생긴다
기본생성자가 에러의 원인
"자식클래스의 생성자"는 "무조건" 가장 먼저 "부모의 기본생성자"를 호출함!!!!

-자기자신 객체 this

- 부모는 super
- 부모의 기본생성자 super();
=>부모클래스에게 기본 생성자가 없다면 자식클래스에서는 에러가 발생한다.
해결방안 두가지
 1) 부모클래스에게 기본 생성자를 선언. - (원칙 : 상부에 보고)
★2) 자식클래스의 생성자가 부모클래스가 가지고 있는 다른 생성자를 호출 - 더 좋은 해결책

생성자 이슈가 상속에서 가장 중요한 이슈다!!!★★★


 

 

▶오버로딩-함수명 중복정의 허용. 메서드시그니쳐가 달라서 가능
▶ 오버라이딩- 메서드 시그니쳐가 똑같은데 기능
부모클래스가 가진 메서드를 자식클래스의 특성에 맞게 재정의
//메서드 재정의 : 상속관계에서만 발생, 메서드 시그니쳐가 동일함.

 

@Override //anotation(어노테이션)
가독성을 높여준다-아!상속관계구나
컴퓨터입장에서는 호출을 빠르게 해줄 수 있다.

 

class Shape {
	String name;
	double area;
	Shape(String name){
		this.name=name;
		this.area=0.0;
	}
	void draw() {
		System.out.println("모양대로 그림 그리기");
	}
}
class Rect extends Shape {
	int x;
	int y;
	Rect(int x){
		this(x,x);
	}
	Rect(int x,int y){
		super("사각형");
		this.x=x;
		this.y=y;
		this.area=this.x*this.y;
	}
	@Override
	void draw() {
		System.out.println("사각형 그림 그리기");
	}
}
class Circle extends Shape {
	int radius;
	static final double PI=3.14;
	Circle(int radius){
		super("원");
		this.radius=radius;
		this.area=this.radius*this.radius*Circle.PI;
	}
	@Override
	void draw() {
		System.out.println("원 그림 그리기");
	}
}

@ 오버라이딩


<Object> : 자바의 최상위 클래스

자바에서 선언 및 생성하는 모든 클래스는 Object를 상속받음

예) .equals()  , .toString()

System.out.println(s);
System.out.println(s.toString());
=>둘은 같은 값을 지닌다
s는 toString을 자동호출하고 있었다.
toString 은 Object 자바에서 제공함

 

generate toString을 더 많이 쓴다.
super toString은 커스터마이징 할 경우 아니면 잘 쓰지 않는다.

 

★중요★ : 순서유의
1.멤버변수생성자
2. 메서드
3. getter/setter
4. toString