[K-디지털 트레이닝] 학습정리 32일차 (2024-07-31)

smoo·2024년 7월 31일

JAVA_STUDY

목록 보기
17/25
post-thumbnail

1. Object 클래스에 대하여 설명하시오.

  • Object는 모든 클래스의 최상위 부모 클래스
  • Object 클래스는 필드가 없고 메소드로 구성되어 있으며 모든(All) 클래스는 Object 클래스를 상속한다.
  • 모든 클래스에서 Object 클래스에 구성된 메소드를 사용할 수 있다.


2. 주소가 출력되는 이유를 설명하시오.

class A{

}
	public static void main(String[] args) {
		A a = new A();
		System.out.println(a); // String s = String.valueOf(x); -> s가 주소 뿌림
	}

1) 기본적으로 모든 클래스는 Object 클래스를 상속하기 때문에 class A는 Object 클래스를 상속한다.

2) Object 클래스에는 문자열을 반환하는 toString함수가 있다. 하지만 class A에는 toStirng함수가 override되어있지 않아서 a가 가리키는 객체의 주소값을 출력하게 된다.


3. interface 와 class 의 차이는?

① interface

  • interface + interface명 ();→ 함수 선언부(정의), body없음 (당연히 생성자 만들 수 없음) = 추상메소드
  • implements 키워드로 인터페이스를 구현할 (자손)클래스 표시
  • 둘 이상의 다중 인터페이스 구현 가능 (implements A, B 쉼표로 구분)
  • body가 없으므로 객체 생성 불가, 선언 혹은 구현만 가능함
  • 무조건 public 이어야 한다.
  • 이름은 -able 혹은 I+이름으로 짓는 것이 관례

② class

  • class + class명 () {body} → body 있음(함수, 변수 모두 올 수 있다.)
  • extends 키워드로 상속 표시함
  • 단일 상속만 가능함 (자식이 상속) / 다중 상속 안됨
    객체 생성 가능
    → interface와 class를 동시에 상속, 구현 가능

4. ⭐️ 다음을 프로그램 하시오.⭐️

	public void print(String doc);
}

	//SPrinterDriver 와 LPrinterDriver를 만드시오
	public static void main(String[] args) {
		String myDoc = "This is a report about...";

		// 삼성 프린터로 출력
		Printable prn = new SPrinterDriver();
		prn.print(myDoc);
		System.out.println();

		// LG 프린터로 출력
		prn = new LPrinterDriver();
		prn.print(myDoc);
	}

✅ 구현

//삼성 프린터
class SprinterDriver implements Printable {
	@Override
	public void print(String doc) {
		System.out.println("From Samsung pirnter");
		System.out.println(doc);
	}
}

//LG 프린터
class LprinterDriver implements Printable {
	@Override
	public void print(String doc) {
		System.out.println("From LG pirnter");
		System.out.println(doc);
	}
}

5. @Override 에 대하여 설명하시오.

  • 부모 클래스(super class)에 존재하는 필드나 메서드를 자식 클래스(sub class)에서 재정의하여 사용하는 것.
  • 현재 메소드가 부모 클래스의 메소드를 오버라이드 한 것임을 컴파일러에게 명시하고, 부모 클래스에 해당하는 메소드가 없다면 에러를 발생시킨다.

6. interface 의 구성요소는?

  • 인터페이스는 표준이자 규약이다. (함수명도 규약이 됨. 강제시킴 = 표준화)
  • 인터페이스가 없다면 printable 예시의 경우 각각 객체를 생성, 각각 다른 함수를 사용해야하므로 회사가 많아지면 점점 관리가 까다로워진다. 인터페이스를 사용하면 함수 선언부를 정의해주고 있어서 그 규약에 맞게 각각의 회사가 맞춰서 구현을 하게되므로 관리에 용이하다.
  • 선언 부분과 구현 부분을 분리시켜 독립적으로 프로그램을 작성할 수 있다.
  • 세부 정보를 숨기고 인터페이스를 통해 중요한 정보만 표시해서 보안을 확보할 수도 있다.

7. interface에 올 수 있는 두 가지는?

interface Printable {    
	public void print(String doc); // 추상 메소드(=함수정의, 선언만)
   //(abstrct 생략 가능)인터페이스 무조건 public, abstract 함수
}

interface Printable {
	public static final int PAPER_WIDTH = 70;  //상수
	public static final int PAPER_HEIGHT = 120;  
	public void print(String doc);
  //무조건 public static final 이어야 함(생략가능: 컴파일러가 붙여줌)
}

8. abstract 키워드에 대하여 설명하시오.

  • abstact: 추상의 의미.
  • abstract 키워드는 생략 가능(컴파일러 자동 생성)
  • 인터페이스 내에 있는 함수의 body부분이 없고 선언 부분만 있기 때문에 구현은 자손 클래스에서 해야한다.(자손이 구현!)
  • 그렇기 때문에 인터페이스는 객체를 만들 수 없다.

9. 아래의 출력 결과가 아래와 같이 나오도록 프로그래밍 하시오.

Object obj = new Circle(10);
System.out.println(obj); //출력: 넓이는 100 입니다. (예시)

✅ 구현

class Circle {
	public double r;
	
	public Circle(double r) {
		this.r = r;
	}
	
	public double getArea() {
		return r*r*Math.PI;
	}
	
	@Override
	public String toString() {
		return "넓이는 " +getArea()+ "입니다.";
	}
}


public class ObjCircle {

	public static void main(String[] args) {
		
		Object obj = new Circle(10);
		System.out.println(obj);	//출력 : 넓이는 100 입니다. (예시)

	}

}

10.instanceof 연산자에 대하여 예를 들어 설명하시오.

Box box1 = new Box();                  
		PaperBox box2 = new PaperBox();
		GoldPaperBox box3 = new GoldPaperBox();  
		
		/*
		box1은 Box클래스 참조, Box객체 생성
		box2는 PaperBox클래스 참조, PaperBox객체 생성
		box3은 GoldPaperBox클래스 참조, GoldPaperBox객체 생성
		*/

		wrapBox(box1);
		wrapBox(box2);
		wrapBox(box3);
	}

	public static void wrapBox(Box box) {
		if (box instanceof GoldPaperBox) {
			((GoldPaperBox) box).goldWrap();
		} else if (box instanceof PaperBox) {
			((PaperBox) box).paperWrap();
		} else {
			box.simpleWrap();
/*
box1 → GoldPaerBox(x) → PaperBox(x) → box.simpleWrap();
box2 → GoldPaerBox(x) → PaperBox(o) → ((PaperBox) box).paperWrap();
box3 → GoldPaerBox(o) → ((GoldPaperBox) box).goldWrap();

형변환을 시켜준 이유:
box 객체가 어떤 타입을 참조하는지 모르기 때문에 형변환으로 명시해준것임
*/

profile
코딩 스터디 정리

0개의 댓글