SW공부 31일차

Guryena·2023년 2월 9일
0

CS

목록 보기
24/34

1. 아래가 돌아 가도록 하시오

interface ICalculator{
	public abstract int add(int num,int num2);
	public abstract int sub(int num,int num2);
	public abstract int mul(int num,int num2);
	 int div(int num,int num2);
}

class PrintableInterface {
    public static void main(String[] args) {
    	ICalculator calculator = new MyCalculator();
    	System.out.println(calculator.add(10, 20)); //30
    	System.out.println(calculator.sub(10, 20)); //-10
    	
    	//Printable prn = new Printer();
        //prn.print("Hello Java");
    }
}
public class MyCalculator implements ICalculator {

	@Override
	public int add(int num1, int num2) {
		int add = num1 + num2;
		return add;
	}

	@Override
	public int sub(int num1, int num2) {
		int sub = num1 - num2;
		return sub;
	}

	@Override
	public int mul(int num1, int num2) {
		int mul = num1 * num2;
		return mul;
	}

	@Override
	public int div(int num1, int num2) {
		int div = num1 / num2;
		return div;
	}

}

2. 아래가 돌아 가도록 하시오.

interface Printable {
    public abstract void print(String doc) ;
}
	public static void main(String[] args){
    	Printable prn = new Printer();
        prn.print("Hello Java");
}
class Printer implements Printable {

	@Override
	public void print(String doc) {
		System.out.println(doc);
	}
}

3. 애너테이션이란?

  • 자바 애너테이션(Java Annotation)은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. 보통 @ 기호를 앞에 붙여서 사용한다. JDK 1.5 버전 이상에서 사용 가능하다. 자바 애너테이션은 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다.
    자바는 언어에 내장된 애너테이션들의 집합을 정의한다. 7개의 표준 애너테이션 중에 3개가 java.lang의 일부이며, 나머지 4개는 java.lang.annotation으로부터 가져온다.[1][2]

    자바 코드에 적용되는 내장 애너테이션
    @Override
    @Deprecated
    @SuppressWarnings

    기타 애너테이션에 적용되는 애너테이션 (메타 애너테이션)
    @Retention
    @Documented
    @Target
    @Inherited

    자바 7부터 추가 애너테이션이 언어에 추가되었다.
    @SafeVarargs
    @FunctionalInterface
    @Repeatable

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

컴퓨터 과학에서 객체 또는 오브젝트(object)는 클래스에서 정의한 것을 토대로 메모리(실제 저장공간)에 할당된 것으로 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며, 변수, 자료 구조, 함수 또는 메소드가 될 수 있다.
프로그래밍 언어는 변수를 이용해 객체에 접근하므로 객체와 변수라는 용어는 종종 함께 사용된다. 그러나 메모리가 할당되기 전까지 객체는 존재하지 않는다.

절차적 프로그래밍에서 하나의 객체는 자료나 명령을 포함할 수 있지만 두 가지를 동시에 포함하지는 않는다. (명령은 프로시저나 함수의 형태를 가진다).

객체지향 프로그래밍에서 객체는 클래스의 인스턴스이다. 클래스 객체는 자료와 그 자료를 다루는 명령의 조합을 포함하여 객체가 메시지를 받고 자료를 처리하며 메시지를 다른 객체로 보낼 수 있도록 한다. 실세계의 비유로 설명하자면, 가령 어떤 사람이 집에서 살기를 원할 때, 그 집의 청사진(집의 설계도)이나 축소 모형 따위는 전혀 필요가 없다. 필요한 것은 설계에 맞는 실제 집이다. 이 비유에서 청사진은 클래스를, 실제 집은 객체를 나타낸다.

  • java.lang 패키지
    java.lang 패키지는 자바에서 가장 기본적인 동작을 수행하는 클래스들의 집합
    따라서 자바에서는 java.lang 패키지의 클래스들은 import 문을 사용하지 않아도 클래스 이름만으로 바로 사용할 수 있도록 하고 있다.
  • java.lang.Object 클래스
    java.lang 패키지 중에서도 가장 많이 사용되는 클래스는 바로 Object 클래스
  • Object 클래스는 모든 자바 클래스의 최고 조상 클래스가 된다.
    따라서 자바의 모든 클래스는 Object 클래스의 모든 메소드를 바로 사용할 수 있다.
    이러한 Object 클래스는 필드를 가지지 않으며, 총 11개의 메소드만으로 구성되어 있다.
  • toString() 메소드
    toString() 메소드는 해당 인스턴스에 대한 정보를 문자열로 반환한다.
    이때 반환되는 문자열은 클래스 이름과 함께 구분자로 '@'가 사용되며, 그 뒤로 16진수 해시 코드(hash code)가 추가된다.
    16진수 해시 코드 값은 인스턴스의 주소를 가리키는 값으로, 인스턴스마다 모두 다르게 반환된다.
Car car01 = new Car();
Car car02 = new Car();

System.out.println(car01.toString());
System.out.println(car02.toString());

//결과
Car@15db9742
Car@6d06d69c
  • equals() 메소드
    equals() 메소드는 해당 인스턴스를 매개변수로 전달받는 참조 변수와 비교하여, 그 결과를 반환한다.
    이때 참조 변수가 가리키는 값을 비교하므로, 서로 다른 두 객체는 언제나 false를 반환하게 된다.
Car car01 = new Car();
Car car02 = new Car();

System.out.println(car01.equals(car02));

car01 = car02; // 두 참조 변수가 같은 주소를 가리킴.

System.out.println(car01.equals(car02));

//실행 결과
false
true
  • clone() 메소드
    clone() 메소드는 해당 인스턴스를 복제하여, 새로운 인스턴스를 생성해 반환한다.
    하지만 Object 클래스의 clone() 메소드는 단지 필드의 값만을 복사하므로, 필드의 값이 배열이나 인스턴스면 제대로 복제할 수 없다.
    따라서 이러한 경우에는 해당 클래스에서 clone() 메소드를 오버라이딩하여, 복제가 제대로 이루어지도록 재정의해야 한다.

    이러한 clone() 메소드는 데이터의 보호를 이유로 Cloneable 인터페이스를 구현한 클래스의 인스턴스만이 사용할 수 있다.

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

class A{

}

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

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

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

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

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

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

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

자바 프로그래밍 언어에서 클래스들이 구현해야 하는 동작을 지정하는데 사용되는 추상 자료형이다. 이들은 프로토콜과 비슷하다.
인터페이스는 interface 라는 키워드를 사용하여 선언하며, 메소드 시그너처와 상수 선언(static과 final이 둘 다 선언되는 변수 선언)만을 포함할 수 있다.
자바 8 미만의 모든 버전을 기준으로 인터페이스의 모든 메소드는 구현체(메소드 바디)를 포함하고 있지 않다. 자바 8부터, default와 static 메소드는 interface 정의에 구현체를 가지고 있을 수 있다.

인터페이스 정의

인터페이스들은 다음의 구문을 사용하여 정의된다.

*[visibility]* interface InterfaceName *[extends other interfaces]* {
        constant declarations
        abstract method declarations
}
예: public interface Interface1 extends Interface2;

인터페이스의 바디(body)는 추상 메소드를 포함하고 있지만 인터페이스 내의 모든 메소드들이 정의상 추상적이기 때문에 abstract 키워드가 필요하지 않다. 인터페이스는 노출된 행동들의 집합을 규정하므로 모든 메소드들은 암묵적으로 public이다.

그러므로 단순한 인터페이스는 다음과 같이 될 수 있다.

public interface Predator {
       boolean chasePrey(Prey p);
       void eatPrey(Prey p);
}

클래스에서의 인터페이스 구현

인터페이스 구현 문법은 다음 공식을 사용한다:

... implements InterfaceName [, another interface, another, ...] ...

클래스는 인터페이스를 구현할 수 있다. 이를테면 다음과 같다.

public class Lion implements Predator {

        @Override
        public boolean chasePrey(Prey p) {
               // programming to  chase prey p (specifically for a lion)
        }

        @Override
        public void eatPrey(Prey p) {
               // programming to eat prey p (specifically for a lion)
        }
	}

클래스가 인터페이스를 구현하면서 메소드를 모두 구현하지 않는다면, abstract로 표시되어야 한다.
클래스가 추상적이라면 서브클래스들 중 하나가 미구현 메소드를 구현할 것이라 예측한다.
추상 클래스의 서브클래스들 중 어느 것도 인터페이스 메소드를 모두 구현하지 않더라도 서브클래스 자체는 abstract로 다시 표시되어야 한다.

클래스들은 여러 인터페이스들을 구현할 수 있다.

 public class Frog implements Predator, Prey { ... }

인터페이스들은 일반적으로 콜백을 목적으로 자바 언어에서 사용된다.자바는 메소드(프로시저)를 인수(argument)로 전달하는 것을 허용하지 않는다.

서브인터페이스

인터페이스들은 아래와 같은 동일 공식을 사용하여 기타 여러 인터페이스들을 확장(extend)할 수 있다. 이를테면, 다음은

 public interface VenomousPredator extends Predator, Venomous {
         //interface body
 }

유효한 문법이며 서브인터페이스를 정의한다.

0개의 댓글