JAVA 14일차

MOZZI KIM·2022년 11월 11일
0

JAVA

목록 보기
14/21
post-thumbnail

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

📌 Object클래스

  • 단순하게 모든클래스(API 또는 내가 만든 class 등)는 Object클래스의 자식클래스이다.
    즉, Object클래스가 자바에서 '최상의 클래스'이다.
    Object클래스에는 다양한 메소드가 존재하는데, 어떤 클래스에서도 이 메소드를 호출할수있다.

📌 Object클래스 대표 메소드 종류

  • equals() 메소드 : 두 객체가 동일한 객체라면 true를 리턴하고, 다르다면 false를 리턴.
  • hashCode() 메소드 : 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴.
    객체마다 다른값을 가지고 있다.
  • toString() 메소드 : 객체의 문자 정보를 리턴한다. 즉, 객체를 문자열로 표현.

2. 아래에서 주소가 출력되는 이유를 순차적으로 설명하시오.

class A{

}

public class Test {
	public static void main(String[] args) {
		A a = new A();
		System.out.println(a); 
	}
}

👉1. 기본적으로 모든 클래스는 Object 클래스를 상속하기 때문에 class A는 Object 클래스를 상속한다.
2. Object 클래스에는 문자열을 반환하는 toString함수가 있다.
하지만, class A에는 toStirng함수가 override되어있지 않아서 a가 가리키는 객체의 주소값(가짜)을 출력하게 된다.👈


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

📌 1. final 필드(final field)

final을 가장 많이 사용하는 곳은 필드(전역변수)이다.
final을 필드에 사용하면 그 필드는 더 이상 수정이 불가능하다는 의미를 갖는다.

class FinalField{
	final String str = "수정불가";
	public void method(){
		str="수정"; // 컴파일 에러 : 수정 불가
	}
}

📌2. final 클래스(class)

class를 선언할 때 final 키워드를 class 앞에 붙여주면 된다. final class가 갖는 의미는 더 이상 상속이 불가능하다는 것을 의미한다.

final class FinalClass{}
class FinalTest extends FinalClass{} // 컴파일 에러

위의 소스 코드와 같이 final로 클래스를 선언하였다.
다른 클래스에서 final로 선언한 클래스를 상속하려 하지만 컴파일 에러가 발생한다.
왜냐면 👉final 클래스는 더 이상 상속이 불가능👈하기 때문이다.

📌3. final 메소드(method)

method를 선언할 때 final 키워드를 붙인 메소드를 말한다. final 메소드는 오버라이딩을 금지할 때 사용된다.

class FinalMethod{
	final void sum(){}
}

class FinalTest extends FinalMethod{
	void sum(){} // 컴파일 에러
}

위의 소스 코드와 같이 부모 클래스에 final 메소드를 정의하였다.
자식 클래스에서 final 메소드를 오버라이딩을 시도하면 컴파일 에러가 발생한다.
👉final 메소드는 오버라이딩을 금지👈하기 때문이다.
위에서 알아본 것과 같이 final을 사용하면 변경이나 수정이 불가능하다. 따라서 상황에 맞게 더 이상 상속이나 오버라이딩 등을 금지하고자 할 때 final 키워드를 사용하면 된다.


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);
}
class SPrinterDriver implements Printable {
	@Override
	public void print(String doc) {
		System.out.println("From Samsung printer");
		System.out.println(doc);
	}
}

//lg제조사
class LPrinterDriver implements Printable {
	@Override
	public void print(String doc) {
		System.out.println("From LG printer");
		System.out.println(doc);
	}
}

public class InterfaceMain {
	//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 ...
*/

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


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

자식 클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점이 있다.
하지만, 클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등 여러 가지 문제가 발생할 수 있어 자바에서는 클래스를 통한 다중 상속은 지원하지 않지만,
다중 상속의 이점을 버릴 수 없어서 자바에서는 인터페이스라는 것을 통해 다중 상속을 지원하고 있다.

📌인터페이스(interface)란?

다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 👉추상 클래스👈를 의미한다.
자바에서 추상 클래스는 추상 메소드뿐만 아니라 생성자, 필드, 일반 메소드도 포함할 수 있다.
하지만, ⭐인터페이스는 오로지 추상 메소드와 상수만을 포함⭐한다.

📌인터페이스의 선언
자바에서 인터페이스를 선언하는 방법은 클래스를 작성하는 방법과 같다.

인터페이스를 선언할 때에는 접근 제어자와 함께 interface 키워드를 사용한다.

⭕문법

접근제어자 interface 인터페이스이름 {

    public static final 타입 상수이름 =;

    ...

    public abstract 메소드이름(매개변수목록);

    ...

}

단, 클래스와는 달리 인터페이스의 모든 필드는 public static final이어야 하며, 모든 메소드는 public abstract이어야 한다.

이 부분은 모든 인터페이스에 공통으로 적용되는 부분이므로 이 제어자는 생략할 수 있다.
이렇게 생략된 제어자는 컴파일 시 자바 컴파일러가 자동으로 추가해준다.

📌인터페이스의 구현
인터페이스는 추상 클래스와 마찬가지로 자신이 직접 인스턴스를 생성할 수는 없다.
따라서 인터페이스가 포함하고 있는 추상 메소드를 구현해 줄 클래스를 작성해야한다.

⭕문법

class 클래스이름 implements 인터페이스이름 { ... }

 

만약 모든 추상 메소드를 구현하지 않는다면, abstract 키워드를 사용하여 추상 클래스로 선언해야 합니다.
//인터페이스를 구현하는 예제.

interface Animal { public abstract void cry(); }

class Cat implements Animal {
    public void cry() {
        System.out.println("냐옹냐옹!");
    }
}

class Dog implements Animal {
    public void cry() {
        System.out.println("멍멍!");
    }
}
public class Polymorphism {
    public static void main(String[] args) {
        Cat c = new Cat();
        Dog d = new Dog();
        c.cry();
        d.cry();
    }
}

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 Circleeeee {
	public static void main(String[] args) {
		Object obj = new Circle(10);
		System.out.println(obj);
	}
}
profile
코린이

0개의 댓글