IT 면접족보/자바 면접족보

자바 수업 정리 - instanceof, Object class, final, @Override, interface (16일 차 )

낙산암 2020. 12. 16. 17:19

자바 면접 족보 정리(16일 차 )

 

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

 

모든(All) 클래스는 Object 클래스를 상속한다.(Object 클래스는 모든 클래스의 조상)

subclass는 Object 클래스를 직접 상속 하지는 않지만 간접적으로(Object 클래스를 상속하는 클래스를 상속하는 형태)결국은 Object 클래스를 상속하게 된다.

= Object 클래스를 사용할 수 있다

 

데이터 멤버는 없고, 함수 11개가 있다. (우리가 꼭 기억해야 할 것은 빨간색-앞으로 배움) 이 11개의 함수는 모든 클래스에서 (object class와 상속 관계이기 때문에)사용이 가능하다!

 

//hashCode(), toString(), equals()는 꼭 알아야함!!

 

2. 아래와 같이 출력되는 이유를 설명하시오.

먼저 다음을 출력해 보면 java_1214.A@28a418fc 와 같은 가짜 주소 값이 나온다.

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

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

class A{

}

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

아래와 같이 출력되는 이유

  1. 이렇게 의미 없는 값이 출력되지 않도록 Object class의 String toString()함수를 override 하면 Object의 자식 클래스인 class A의 tring toString() 함수가 호출된다. (모든 클래스는 Object클래스 상속, 상속에서 override하면 자식꺼!)

  2. println()함수가 객체 이름을 매개 변수로 받아서 toString()을 호출할 수 있도록 overload되어 있기 때문에 a.toString을 붙이지 않아도 위의 문제와 같이 원하는 문자열이 출력되는 결과를 얻을 수 있다.

3. class이름 및 함수에서 final의 의미는?

  • final class: 클래스가 마지막이다 → 더 이상 다른 클래스가 상속할 수 없다.
  • final mehod: 함수가 마지막이다. → 다른 클래스에서 overriding 할 수 없다.
public final class MyLastCLS {...}
// MyLastCLS 클래스는 다른 클래스가 상속할 수 없음 (클래스가 마지막이다.)

class Simple {
	public final void func(int n) {...}  
}
// func() 메소드는 다른 클래스에서 오버라이딩 할 수 없음(함수가 마지막이다.)

4. interface 와 class 의 차이는?

interface

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

class

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

→ interface와 class를 동시에 상속, 구현 가능

 

 

//abstract 생략 가능(컴파일러가 자동생성)
interface Printable {
	abstract public void print(String doc); 
}

class A {

}

class Printablei implements Printable extends A{    
	A a = new A();     
	//클래스끼리는 객체생성이 됨

	Printable p = new Printable(); //(x)
	//incterface는 객체 생성 안됨 왜? 구현부분이 없어서 써먹을수 없으니까

	Printable p;   
	//선언은 가능(4바이트 방잡기는 가능) → 참조변수 선언이 가능하다.
	
	//interface 함수의 구현부분(overriding)
	@OVerride
	public void print(String doc){구현 내용};  //중괄호가 있다.
}

5. 다음을 프로그램 하시오.[필수] ⭐️

interface Printable { // MS가 정의하고 제공한 인터페이스
	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);
	}

/*
출력: 
From Samsung printer
This is a report about ...
From LG printer
This is a report about ...
*/

풀이)

package java_1214;

interface Printable { // MS가 정의하고 제공한 인터페이스
	public void print(String doc);
}

class SPrinterDriver implements Printable {
	public void print(String doc) {
		System.out.println("From Samsung printer");
		System.out.println(doc);
	} 
}
	
class LPrinterDriver implements Printable {
	public void print(String doc) {
		System.out.println("From LG printer");
		System.out.println(doc);
	} 
}

public class PrintInterfaceEx {
	//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);
	}

}

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

Annotation(주석): @Override

오버라이딩 하라고 좀 더 명확하게 개발자들에게 알려주는 것 컴파일시 에러 등을 발생시켜 경고나 확인을 하는 목적으로 사용한다. → 안전성을 위한 것 @Override 는 현재 메소드가 부모 클래스의 메소드를 오버라이드 한 것임을 컴파일러에게 명시하고, 부모 클래스에 해당하는 메소드가 없다면 에러를 발생시킨다.

 

 

7. interface 에 대하여 설명하시오.

  1. 인터페이스는 표준이자 규약이다. (함수명도 규약이 됨. 강제시킴 = 표준화)

인터페이스가 없다면 printable 예시의 경우 각각 객체를 생성, 각각 다른 함수를 사용해야하므로 회사가 많아지면 점점 관리가 까다로워진다. 인터페이스를 사용하면 함수 선언부를 정의해주고 있어서 그 규약에 맞게 각각의 회사가 맞춰서 구현을 하게되므로 관리에 용이하다.

  1. 선언부분과 구현부분을 분리시켜 독립적으로 프로그램을 작성할 수 있다. (외주)
  • 세부 정보를 숨기고 인터페이스를 통해 중요한 정보만 표시해서 보안을 확보할 수도 있다.

8. 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 이어야 함(생략가능: 컴파일러가 붙여줌)
}

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

interface method의 abstract 키워드의 의미

abstact:

추상의 의미. abstract 키워드는 생략 가능(컴파일러 자동 생성)

인터페이스 내에 있는 함수의 body부분이 없고 선언 부분만 있기 때문에 구현은 자손 클래스에서 해야한다.(자손이 구현!)

그렇기 때문에 인터페이스는 객체를 만들 수 없다.

public :

인터페이스는 기본적으로 public이다. 다른 접근 제한자 안됨 (예시에서 한 파일에 interface 넣었을 경우에는 기본적으로 .java파일에서 public은 진입점을 의미 하므로 하나만 올 수 있어서 메인 함수를 포함하는 클래스에 public이 붙여 줘야 하므로 안 쓴것임)

 

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

Object obj = new Circle(10);

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

 

class Circle {
	private int radius;

	public Circle(int radius) {
		this.radius = radius;
	}

	public String toString() {
		return "넓이는 "+ (radius * radius * Math.PI) +"입니다.";
	}
}

public class CircleObj {
	public static void main(String[] args) {
		Object obj = new Circle(10);
		System.out.println(obj);
	}
}

11. 아래의 메모리를 그리시오.

class MobilePhone {
	protected String number;
	
	public MobilePhone(String num) {
    number = num;
	}    

	public void answer() {
    System.out.println("Hi~ from " + number);
	}
}

class SmartPhone extends MobilePhone {
	private String androidVer;

	public SmartPhone(String num, String ver) {
    super(num);
    androidVer = ver;
	}    
	
	public void playApp() {
    System.out.println("App is running in " + androidVer);
	}
}


	MobilePhone phone = new SmartPhone("010-555-777", "Nougat"); //폴리머피즘 적용
	phone.answer();    	
	SmartPhone s = (SmartPhone)phone; //자식=부모 원래는 안됨, 되는 케이스: 형변환을 시켜주는것
	s.playApp();

형변환 되는 원리:

자식(스마트폰)객체를 ㅋ 생성해서 이미 메모리에 가지고 있기 때문에 형변환이 가능하다.

 

12.instanceof 연산자에 대하여 설명하시오.

A instanceof B = A(객체) instance of B(클래스명) 
//	→ true or false (연산자 이기 때문)

if(ref instanceof ClassName)

/*
ref가 ClassName 클래스의 인스턴스를 참조하면 true 반환
ref가 ClassName를 상속하는 클래스의 인스턴스이면 true 반환
	 → 앞에오는게 뒤에오는것을 상속하면 true
*/
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 객체가 어떤 타입을 참조하는지 모르기 때문에 형변환으로 명시해준것임
*/