[면접예상] 20230628

neul·2023년 6월 28일
0

면접예상

목록 보기
15/36
post-thumbnail

🦖추상 클래스 와 interface 의 차이는?

구현 방식

  • 추상 클래스는 클래스로서 정의되며, 일반적으로 일부 메서드는 구현되어 있고 일부 메서드는 추상 메서드로 선언되어 하위 클래스에서 구현해야 한다.
  • 반면에 인터페이스는 인터페이스로서 정의되며, 모든 메서드는 추상 메서드로 선언되어 있고 하위 클래스에서 구현해야 한다.
  • 따라서 추상 클래스는 일부 구현을 가질 수 있지만, 인터페이스는 오로지 추상 메서드로만 구성된다.

상속 및 구현

  • 추상 클래스는 단일 상속만을 지원하며, 다른 클래스로부터 상속받을 수 있다. 또한 일반 멤버 변수와 메서드를 가질 수 있다.
  • 반면에 인터페이스는 다중 상속을 지원하며, 여러 개의 인터페이스를 구현할 수 있다. 인터페이스는 오직 메서드 선언만을 가지며, 멤버 변수를 가질 수 없다.

목적

  • 추상 클래스는 주로 코드의 재사용과 확장을 위해 사용된다. 기본적인 구현을 제공하면서 하위 클래스에서 필요한 부분을 구체화할 수 있다.
  • 인터페이스는 주로 클래스 간의 계약(contract)을 정의하고, 다른 클래스들이 특정 동작을 공유하도록 규정한다. 인터페이스를 구현함으로써 클래스는 특정 인터페이스의 규칙을 따라야 함을 보장한다.

사용 제한

  • 추상 클래스는 인스턴스화될 수 없다. 즉, 직접 객체를 생성할 수 없고 추상 클래스를 상속하여 하위 클래스를 만들어야 한다.
  • 반면에 인터페이스는 인스턴스화될 수 없고, 클래스가 인터페이스를 구현하여 인터페이스의 메서드를 정의해야 한다.

유연성

  • 추상 클래스는 하위 클래스에게 구현을 강제화하므로, 클래스 간의 강한 결합을 만들어 낼 수 있다.
  • 인터페이스는 클래스 간의 느슨한 결합을 가능하게 하며, 다중 상속과 인터페이스의 다중 구현을 통해 유연한 구조를 구성할 수 있다.

🦖Object 클래스의 11개의 함수를 나열해 보시오.

  1. equals(Object obj): 객체의 동등성을 비교
  2. hashCode(): 객체의 해시 코드 값을 반환
  3. toString(): 객체의 문자열 표현을 반환
  4. getClass(): 객체의 클래스 정보를 반환
  5. clone(): 객체의 복제본을 생성하여 반환
  6. finalize(): 가비지 컬렉터에 의해 객체가 소멸되기 전에 호출됨
  7. notify(): 대기 상태에 있는 스레드 중 하나를 깨움
  8. notifyAll(): 대기 상태에 있는 모든 스레드를 깨움
  9. wait(): 스레드를 대기 상태로 만듦
  10. wait(long timeout): 주어진 시간 동안 스레드를 대기 상태로 만듦
  11. wait(long timeout, int nanos): 주어진 시간과 나노초 동안 스레드를 대기 상태로 만듦

🦖아래의 프로그램을 하시오(equals 함수).

Member obj1 = new Member("Black");
Member obj2 = new Member("Black");
Member obj3 = new Member("White");

System.out.println(obj1.equals(obj2)); // true가 출력
System.out.println(obj1.equals(obj3)); // false가 출력

public class Java_01 {
   public static void main(String[] args) {
    Member obj1 = new Member("Black");
      Member obj2 = new Member("Black");
      Member obj3 = new Member("White");

      System.out.println(obj1.equals(obj2)); // true가 출력
      System.out.println(obj1.equals(obj3)); // false가 출력

      Rectangle rec = new Rectangle();
      Rectangle rec2 = new Rectangle();

      boolean b = rec.equals(rec2);
      System.out.println(b); // true가 출력
      class Member extends Object{

	   private String color;
       }
}
	   
public Member(String color) {
	      this.color = color;
	   }
	   
	   @Override
	   public boolean equals(Object obj) {
	      
	      Member member = (Member) obj; // 자식 = 부모 되는 케이스트 자식 = (자식)부모 시켜서 부모에 있는 주소에 자식이 미리 메모리에 올라가 있어야함

	      if (color.equals(member.color))
	         return true;

	      return false;
	      
	   }
	}
   
}

🦖아래를 프로그래밍 하시오.(toString() 함수)

Circle circle = new Circle(10);
System.out.println(circle); //원의 넓이는 314.1592 이고 반지름은 10 인원 
class Circle5{

   private double radius;
   
   
   public Circle5(double radius) {
      this.radius = radius;
   }

   public double getRadius() {
      return radius;
   }
   
   public double getArea() {
      
      return radius*radius*Math.PI;
   }
   
   @Override
   public String toString() {
      return "원의 넓이는 " +getArea()+" 이고 반지름은 "+getRadius() +"인 원";
   }
   
}

public class Java_01 {
   public static void main(String[] args) {
	   
      
      Circle5 circle = new Circle5(10);
      
      System.out.println(circle);
      }
 }

🦖아래를 구현하시오.

abstract class Calc{
    protected int a;
    protected int b;
    void setValue(int a, int b) {this.a = a; this.b = b;}
    abstract int calculate();
}

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("두 정수와 연산자를 입력하시오>> ");
        int a = sc.nextInt();
        int b = sc.nextInt();
        char c = sc.next().charAt(0);

        if(c == '+'){
            Add add = new Add();
            add.setValue(a, b);
            System.out.println(add.calculate());
        }
        else if(c == '-'){
            Sub sub = new Sub();
            sub.setValue(a, b);
            System.out.println(sub.calculate());
        }
        else if(c == '*'){
            Mul mul = new Mul();
            mul.setValue(a, b);
            System.out.println(mul.calculate());
        }
        else if(c == '/'){
            Div div = new Div();
            div.setValue(a, b);
            System.out.println(div.calculate());
        }
    }
// calculate 
abstract class Calc {
   protected int a;
   protected int b;

   void setValue(int a, int b) {
      this.a = a;
      this.b = b;
   }

   abstract int calculate();
}

class Add extends Calc{

   @Override
   int calculate() {
      return super.a + super.b;
   }
   
}

class Sub extends Calc{

   @Override
   int calculate() {
      return super.a - super.b;
   }
   
}

class Mul extends Calc{

   @Override
   int calculate() {
      return super.a * super.b;
   }
   
}

class Div extends Calc{
// 애너테이션은 기본적으로 일정한기능을 가진 함수 
   @Override // 부모에 해당함수 잇어야 한다.
   int calculate() {
      if(super.b == 0) {
         return 0;
      }
      return super.a / super.b;
   }
   
   
}

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

  • 해당 메서드가 상위 클래스나 인터페이스에서 상속받은 메서드를 재정의(Override)한 것임을 표시하는 데 사용된다.

  • 메서드 위에 붙여주면 컴파일러가 해당 메서드가 실제로 상위 클래스나 인터페이스의 메서드를 오버라이딩하고 있는지 확인하고, 오버라이딩 규칙에 맞게 구현되었는지 검사 -> 오버라이딩이 제대로 되지 않은 경우 컴파일 오류가 발생

🦖아래를 프로그래밍 하시오.

Person kim = new Person("홍길동",35);
Person park = new Person(new String("홍길동"),35);
Person heo = new Person("홍길동",34);
	
if(kim.equals(heo))
	System.out.println("같은 사람입니다.");
else
	System.out.println("다른 사람입니다.");
=========================
같은사람입니다.
	      Person kim = new Person("홍길동",35);
	      Person park = new Person("홍길동",35);
	      Person heo = new Person("홍길동",34);
	      
	      if(kim.equals(park))
	         System.out.println("같은 사람입니다.");
	      else
	         System.out.println("다른 사람입니다.");
	      
	      if(kim.equals(heo))
	         System.out.println("같은 사람입니다.");
	      else
	         System.out.println("다른 사람입니다.");
	      
	}
}

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }

        Person otherPerson = (Person) obj;

        return name.equals(otherPerson.getName()) && age == otherPerson.getAge();

🦖try catch finally 에 대하여 설명하시오.

try 블록

  • 예외가 발생할 수 있는 코드를 포함하는 블록
  • try 블록 내에서 예외가 발생하면 해당 예외를 캐치하여 예외 처리를 수행한다.

catch 블록

  • try 블록에서 발생한 예외를 처리하는 블록
  • catch 블록은 예외 타입에 따라 해당 예외를 처리하는 코드를 작성한다.
  • 하나의 try 블록에 여러 개의 catch 블록이 올 수 있으며, 발생한 예외와 일치하는 첫 번째 catch 블록이 실행된다.

finally 블록

  • 예외 발생 여부와 상관없이 항상 실행되는 블록
  • finally 블록은 예외 처리 이후에 항상 실행되어야 하는 코드를 작성하는 데 사용된다.
  • finally 블록은 선택적으로 사용할 수 있다.
  1. try 블록 내의 코드가 실행된다.
  2. 만약 예외가 발생하면, 해당 예외를 캐치하는 catch 블록이 실행된다. (catch 블록의 매개변수는 발생한 예외와 일치하는 타입을 지정)
  3. catch 블록 실행 이후에는 finally 블록이 실행된다. (예외가 발생하지 않았더라도 finally 블록은 항상 실행)
  4. finally 블록 실행 이후에는 예외 처리 구문 이후의 코드가 계속 실행된다.

try-catch-finally 구문은 예외를 처리하고, 자원을 정리하거나 반환하는 등의 작업을 수행하는 데 유용한다.

profile
🍙

0개의 댓글

관련 채용 정보