티스토리 뷰

학습정리-10-26.txt
0.00MB

1. Object 클래스란?

모든 클래스는 Object클래스를 직/간접적으로 상속한다.

실제로 클래스를 작성할 때 내가 따로 적어주지 않아도 extends Object가  붙어있다.

JVM(컴파일러)가 자동으로 상속을 붙여준다.

 

그 외에 컴파일러가 자동으로 생성해주는 것들

1. 자동 형변환

2. 디폴트 생성자

3. 상속시 디폴트 super 생성자

class A extends Object{
      public A() {
             super();
      }
}

Object 클래스 안에는 함수들이 정의되어 있다.

ex ) toString(), hashCode(), equals() 등

 

 

 


2. 아래의 소스코드에 대하여 아래와 같이 출력되는 이유는?
출력
A@28a418fc
==============
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가 주소 뿌림
}
}

toString()은 메소드 오버라이딩.

println(메소드 오버로드의 대표적인 예)안에 객체가 들어가면 객체.toString()이 호출된다.

이때 해당 객체에 toString이 따로 생성되어 있지 않으면 Object.toString()이 호출되는데 해시코드(가짜 주소)가 출력된다.

 

 

 

 


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

클래스 앞에 final이 붙게 되면 상속할 수 없다.

함수 앞에 final이 붙게 되면 오버라이딩을 할 수 없다.

 

 

 

 


4.아래의 Main돌아 가도록 프로그래밍 하시오.
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 edu.kosmo.ex.practices;

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

//SPrinterDriver 와 LPrinterDriver를 만드시오

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

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


public class PrintTest {
	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파일을 던져주는 역할

하드웨어(모니터, 키보드, 마우스 등등)을 OS에서 동작할 수 있도록 해주는 것이 드라이버

 

 

 

 


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

자바 1.5버전부터 업데이트 된 기능.

함수 오버라이딩을 적용할 함수 위에 쓰게 되면 컴파일러가 오버라이딩이 적용되지 않으면 오류를 내줌

ex) toString()함수를 tostring()으로 잘못 적어 오버라이딩이 적용되지 않을 경우 오류를 내줌.

따라서 오버라이딩을 할때는 위에 무조건 적어주는 것이 좋다. 코드를 해석할 때도 알아보기 편리하다.

 

 

 

 


6. interface 에 대하여 설명해 보시오.

interface 안에 함수는 추상함수만이 온다.

interface가 나오게 된 표면적인 이유는 자바의 단일 상속 특성 때문이다.

다중상속이 되지 않아 다중상속을 지원하기 위해서 만들어졌다

ex) class A extends B implements C,D,E

(실제로는 복잡해져서 이렇게 쓰는 경우는 많지 않다.)

 

interface는 약속, 규약, 강제 → 표준을 만들기 위해 사용된다.

실제로 외주를 줄 때 가장 유용하게 사용한다.

 

 

 

 

 


7.interface 안에 올 수 있는 것은 두가지를 말해 보시오?

 interface 안에는

1. 상수(final 변수)가 올 수 있다. (실제 사용 빈도는 적다.)

2. 함수 앞에는 반드시 abstract(추상)가 붙어야 한다. (추상 함수만 만들 수 있다)

추상 함수는 함수 선언만 가능하다. → 바디 실제 구현 부분이 없다. {    }가 없다.

public abstract는 생략이 가능하다. → 없으면 컴파일러가 자동으로 붙여준다.

abstract는 자손이 구현한다. 반드시 오버라이딩이 되어야 한다. ( abstract = 자손이 구현하라 )

→ 구현할 클래스에 implements + 인터페이스명

 

 

 

 

 


8. abstract 키워드란?

interface 안에 들어가는 함수에 붙는 키워드로 '추상의'라는 의미가 있다.abstract 키워드가 붙는 함수를 추상 함수라고 한다.추상함수는 바디(함수 실제 구형 부분)이 없는 함수를 말한다. →  {      }가 없다.

public abstract는 생략이 가능하다. → 없으면 컴파일러가 자동으로 붙여준다.

abstract는 자손이 구현해야 하기때문에 반드시 오버라이딩이 되어야 한다.

( abstract = 자손이 구현하라 )

 

 

 

 

 


9.아래의 결과가 나오도록 프로그래밍 하시오.
Object obj = new Circle(10);
System.out.println(obj);
//출력: 넓이는 314.134 입니다. (예시)

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

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

→ 모든 클래스는 Object를 상속 받고 있기 때문에 extends Object를 붇여주지 않아도 toString()을 오버라이딩 할 수 있다.

 

 

 

 

 

 

10. 아래의 프로그래밍을 하시오.
아래의 인터페이스에 맞추어(상속하여) 아래를 프로그래밍 하시오.
Circle, Rectangle , Triangle

interface AreaGetable{
double getArea();
}


main(){

AreaGetable area = new Circle(4);
sysout(area.getArea())

area = new Rectangle(4,5);
sysout(area.getArea())

area = new Triangle(4,5);
sysout(area.getArea())
}

package edu.kosmo.ex.practices;

interface AreaGetable {
	double getArea();  // double 앞에 public abstract가 생략되어 있음.
}

class Circle implements AreaGetable{
	private int r;
	
	public Circle(int r) {
		this.r = r;
	}
	
	@Override
	public double getArea() {
		return r * r *Math.PI;
	}
		
}

class Rectangle implements AreaGetable{
	private int width, height;
	
	public Rectangle(int width, int height) {
		this.width = width;
		this.height = height;
	}
	
	@Override
	public double getArea() {
		return width * height;
	}
	
}

class Triangle implements AreaGetable{
	private int width, height;
	
	public Triangle(int width, int height) {
		this.width = width;
		this.height = height;
	}
	
	@Override
	public double getArea() {
		return (width * height) / 2;
	}
	
}



public class AreaTest {
	public static void main(String[] args) {
		AreaGetable area = new Circle(4);
		System.out.println(area.getArea());

		area = new Rectangle(4,5);
		System.out.println(area.getArea());

		area = new Triangle(4,5);
		System.out.println(area.getArea());
				
	}
}

 

▶ interface명 정하는 법 : 예전에는 앞에는 I(대문자 i)를 붙여서 작성했다. 최근에는 끝에 able을 붙이는 추세이다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함