관리 메뉴

공부한것들을 정리하는 블로그 입니다.

자바면접 질문유형 본문

JAVA/공부

자바면접 질문유형

호 두 2017. 7. 30. 18:53
반응형

 

- 객체지향의 개념을 설명하시오 

 

자바의 핵심이기때문에 간간히 나오는 질문입니다.

객체, 클래스, 캡슐화, 상속, 다형성 에 대해서 공부하시면 도움이 될것입니다.

 

 

 

 

 

 

- synchronized에 대해 설명하시오 

 

자바의 핵심중 하나인 멀티 쓰레드를 사용하여 여러 자원을 여러 쓰레드가 비동기적으로 처리하다보면

발생하는 자원의 유실등의 문제로 동기화(synchronized) 처리를 해주는 경우가 있습니다. 

검색을 통해 예제를 만들어서 공부하셔야 이해가 빠릅니다. 

 

 

 

 

 

 

- 쓰레드와 프로세스를 설명하시오

 

쓰레드와 프로세스는 엄연히 다릅니다.

프로세스는 쉽게 말해서 하나의 작업 단위라고 할 수 있습니다.

그래서 멀티 프로세스로 작업을 한다면 서로 사용하는 메모리와 자원이 다르기에 자바에서 멀티 쓰레드 방식으로 프로그래밍을 합니다.

한 프로세스 내에 여러 쓰레드가 존재할수 있고 해당 쓰레드들은 자신을 포함한 프로세스의 자원을 공유합니다.

그래서 멀티 쓰레드 프로그래밍을 사용했을때 하드웨어의 성능에 따라서 단일 프로세스 내에서도

월등한 작업속도를 낼 수 있습니다.

단 쓰레드 하나하나를 직접 조작할 수 없기에 쓰레드들이 데이터를 물고 죽어버리던지 했을때

데이터의 유실에 주의하여하하고 각각 쓰레드들이 언제 데이터를 가지고 올지 속도 면에서도 확신을 할 수 없기에

이런 부분에서 주의를 요합니다.

자세한 사항은 예제를 만들어보시고 위의 synchronized 와 함께 사용해보시는것도 좋을듯 합니다.

 

 

 

 

 

 

- 상속에 대해서 설명하시오

 

상속을 통해서 부모 클래스의 요소들을 가지고 자식 클래스를 만들 수 있습니다.

자바 서적을 보면 앞부분에 등장하며 자바를 다룰때 항상 빠지지 않는 부분이기 때문에

상속의 특징과 다중상속이 되지 않는 자바의 특징을 이해하시면 도움이 될것입니다.

다중상속 문제를 해결하기 위해 인터페이스에 대해서도 공부를 하면 좋겠죠?

 

 

 

 

 

 

- 오버로딩과 오버라이딩에 대해서 설명하시오

 

오버로딩이란 클래스내에서 같은 이름으로 메서드를 만드는것을 말합니다.

단 메서드의 이름이 같고 매개변수(파라미터)의 갯수나 타입이 서로 달라야 합니다.

어떻게 보면 확장의 기능을 하고 있는것이 오버로딩입니다.

예를 들어서 공격하다 라는 특징을 갖는 메서드를 만들때 메서드의 네이밍을

 

public void attack(){

// 실행 내용들

}

 

위와 같이 하게 될텐데 attack 이라는 메서드의 파라미터로 int타입의 데미지 를 넘겨줄수도 있지만

데미지와 함께 String 타입의 공격대상을 넣어준다고 합니다.

 

public void attack(int dam, String target){

// 실행 내용들

}

 

위와 같이 넣었는데 둘중에 파라미터를 하나만 넣으면 메서드를 찾지 못해 이셉션이 발생할 것입니다.

 

public void attack(int dam, String target){

// 실행 내용들

}

public void attack(int dam){

// 실행 내용들

}

 

위와같이 attack 라는 이름으로 서로 파라미터가 다른 두개의 메서드를 만들었습니다.

똑똑한 자바는 파라미터의 타입, 갯수를보고 어떤 메서드를 호출할 것인지를 분별해서 실행시킵니다.

 

위와같이 하나의 메서드 이름으로 여러가지 선언을 할수 있게 확장하는것을 오버로딩이라고 합니다.

 

그렇다면 오버라이딩이란 쉽게 말해서 상위클래스를 상속받을때 부모클래스의 속성을 자식 클래스에서 재정의해서 사용하는

재정의의 기능을 가진것입니다.

부모클래스는 이런 메서드에서 이런 기능을 하여 자식 클래스들에게 상속을 해줬습니다.

나머지 자식들은 전부다 그 기능을 그대로 사용하는데 한 자식이 기능을 다르게 사용해야 할 때 사용하며

부모 클래스의 메서드 이름과 파라미터를 동일하게 선언하여 기능 부분을 바꾸어 사용하게 됩니다.

 

 

 

 

 

 

-스트링과 스트링버퍼의 차이에 대해 설명하시오

 

자바의 기본 데이터 타입인 int, float, char 등과 다르게 String은 데이터 타입이 아닌 클래스객체입니다.

데이터 타입들은 시작할때 소문자로 시작하지만 String은 대문자로 시작하죠?

흡사 클래스의 객체를 만들때와 동일합니다.

또한 String은 불변 객체입니다.

한번 String name = "제이"; 라고 선언을 해버리면 먼저 String 객체 타입인 name이라는 인스턴스를 만들고

메모리에 제이 를 올려버립니다. 그리고 name이 제이를 참조하는 래퍼런스가 되는것입니다.

중요한점은 지금부터입니다.

이제 이 name에 새로운 내용을 추가합니다.

name = name + "잡식성개발자";

위와같은 소스를 적용하게 되면 name인스턴스가 가리키는 값은 제이잡식성개발자 가 됩니다.

우리는 흔히 이런식으로 코딩을 했을텐데 아까 위에서 String이 불변 객체라고 성명을 했듯이

한번 선언된 내용에 추가적으로 바뀌지 않습니다. String은 char의 배열 형태가 아니기 때문에 내용의 추가와 삭제가 되지 않거든요

그럼 도대체 어떻게 name 변수의 값이 바뀌는건지 답은 내부에 있습니다.

name = name + "잡식성개발자"; 구문이 실행될때 실제로는 스트링버퍼를 새로 생성해서

name이 가리키는 제이 를 만들어주고 스트링버퍼의 append 함수를 이용하여 잡식성개발자를 붙여줍니다.

그렇게 완성된 스트링버퍼값을 메모리에 올리고 name은 다시 이 값을 참조하게 됩니다.

스트링버퍼는 char 타입의 배열 형태로 되어있어서 한글자 한글자를 append 할 수 있다는것을 아셔야합니다.

그럼 그 와중에 생겨난 메모리 안의 제이 라는 값과 잡식성개발자 라는 값은 가비지컬렉터가 가지고 있다가 필요없어서 버리게 되겠죠

그 짧은 순간에 이런 일처리가 일어나게 되는겁니다.

아주 미세하지만 스트링버퍼를 사용하는경우가 스트링객체를 사용하는것보다 빠를것같다는게 제 생각입니다.

 

 

 

 

 

- 추상클래스와 인터페이스의 차이

 

얼핏 보면 비슷한것 같지만 추상클래스와 인터페이스의 차이는 분명히 있습니다.

추상클래스는  추상메서드 (이름만 존재하고 기능부분이 생략된)를 포함하고있고

이를 상속받은 하위 클래스에서 오버라이딩하여 구현합니다.

어떻게 보면 하위 클래스를 만드는 틀 이라고 할 수 있습니다.

이런이런 기능을 가진 클래스를 만들꺼지만 하위 클래스에서 내용을 구현하겠다 라는겁니다.

건축으로 따지면 골조역할을 한다고 생각하시면 쉽습니다.

 

그렇다면 인터페이스는 일종의 규약 같은겁니다.

이러이러한 기능을 가진 클래스를 만들꺼라는 규약을 정해놓고

하위 클래스에서 해당 기능을 규약대로 구현합니다.

장난감으로 따지면 조립설명서 라고 생각하시면 쉽습니다.

 

다중 상속을 지원하지 않는 자바에서는 보통 추상클래스보다는 인터페이스를 사용하여

객체간의 결합도를 낮추는 프로그래밍을 하곤 하는데 추상클래스 또한 쓰이는 경우가

간혹 있기때문에 꼭 차이점을 알고 넘어가시는게 좋을 것 같습니다.

 

 

 

 

 

 

- 컬렉션 객체의 차이점과 사용법

 

자바에 컬렉션이라고 하면 대표적으로 많이 쓰이는 어레이리스트, 스텍, 큐, 해시맵, 해시테이블 등등이 있습니다.

컬렉션을 공부하실때는 그 컬렉션이 선입선출이냐 후입선출이냐의 개념과 사용법을 알아보시면 좋을듯 합니다.

깊이 공부하시려면 그 컬렉션을 구성하고 있는 알고리즘을 이해하시면 외우실때 더 편합니다.

 

 

 

 

 

 

- statement와 prestatement의 차이점

 

블로그 글 참고

http://drsggg.tistory.com/63

 

 

 

 

 

- final과 static의 용도 및 용어정리(변수, 메소드, 클래스)

블로그 글 참고

 

 

 

 

 

 

※ 객체지향(object-oriented)과 절차지향(procedural-oriented)
① 객체지향
- 객체를 생성하고 객체들간의 메시지를 통하여 정보를 교환함으로서 프로그래밍이 이루어짐
- 객체 : 자신에게 주어진 데이터와 메소드만을 가지고 일을 수행하는 하나의 단위.
- 객체지향언어 예) 자바

 

② 절차지향
- 대부분 데이터를 변화시키는 알고리즘으로 구성.
- 데이터와 그 데이터를 변화시키는 알고리즘이 분리된 형태.
- 프로그램 작성을 위해서는 모든 데이터구조를 이해하고 있어야하는 불편한 점이 있음.
- 절차지향언어 예) C, Pascal, Fortran 등

 

 

 

※ 객체(Object)
- 효율적으로 정보를 관리하기 위하여, 사람들이 의미를 부여하고 분류하는 논리적 단위
- 구성요소 : 데이터 - 자신의 속성.

                  메소드 - 데이터를 조작 처리하는 절차를 기술.
- 객체지향 언어에서 객체는 반드시 클래스로부터 생성.

 

※ 클래스(Class)
- 객체 생성을 위해 사용하는 형판(모든 객체는 클래스로부터 생성)
- 객체는 데이터와 메소드를 가지고, 클래스는 데이터구조 즉 속성과 메소드를 가짐.
- 객체지향프로그램 : 클래스의 작성 + 작성된 클래스로부터 객체의 생성
                              + 생성된 객체사이의 메시지 전송
- 실체화(instantiation) : 클래스로부터 객체를 생성하는 과정.
- 인스턴스(instance) : 생성된 객체=>객체=인스턴스

 

※ 상속(inheritance)
- 기존 클래스로부터 모든 속성과 메소드를 생성받고,
   더 필요한 속성과 메소드를 추가하여 새로운 클래스를 생성.
- 코드를 간결하게 하고, 코드의 재사용성을 높임.
- 다중상속 : 하나의 클래스로부터 상속되는 것이 일반적이지만 다수개의 클래스로부터 상속받아
                 새로운 클래스를 생성하는 경우.

 

※ 캡슐화(encapsulation)
- 객체가 실제 데이터를 어떻게 처리하는지 알 수 없다는 의미.
- 클래스를 작성할 때 작성자는 숨겨야하는 정보와 공개해야하는 정보를 구분하여 기술 가능
   -> 객체를 사용하는 사람은 객체 중에 공개하는 정보에만 접근 가능   : 객체의 사용자로부터 정보 은폐가능.
- 장점 : 객체를 포함한 정보의 손상과 오용을 막을 수 있다.
           객체 조작 방법이 바뀌어도 사용방법은 바뀌지 않는다.           데이터가 바뀌어도 다른 객체에 영향을 주지 않아 독립성이 유지된다.           처리된 결과만 사용하므로 객체의 이식성이 좋다.           객체를 부품화 할 수 있어 새로운 시스템의 구성에 부품처럼 사용할 수 있다.

 

※ 메시지(message)
- 객체에게 일을 시키는 행위.
- 메시지를 받을 객체의 이름, 메소드 이름, 메소드의 수행에 필요한 인자(argument)를 포함.
- 메시지를 전달받은 객체는 메시지의 내용을 분석하여 메시지에 지정된 메소드를 수행하여
  결과를 반환.

 

※ 다형성(polymorphism)
- 하나의 인터페이스를 이용하여 서로 다른 구현 방법을 제공
  (one interface, multiple implement)
- 상속관계의 계층구조에서 상위클래스를 참조하는 객체변수(포인터)에 하위클래스(상속관계)에서
  생성된 객체를 할당할 수 있다는 개념.(반대의 경우는 허용하지 않음)

 

※ 프로그램 작성 예class Exam {
          int c;

     public int add(int a, int b) { 

//메소드 생성


          c=a+b;
          return c;
     }
}

 

public class ExamTest { 

/*클래스 Exam으로부터 객체를 생성하여 사용
                                      객체로부터 반환된 결과를 프린트한다*/

     public static void main(String args[]) { 

//ExamTest 클래스는 main()메소드를 정의

          int sum;
          int x, y;

 

          x=Integer.parseInt(args[0]);
          y=Integer.parseInt(args[1]);

         

          Exam examobject=new Exam(); 

//Exam 클래스로부터 examobject라는 객체 생성

          sum=examobject.add(x,y); 

/*명령행 인자로 입력된 x,y값을 매개변수로 하여 examobject객체의 add() 메소드를 수행하라는 메시지를 보내면 add()메소드는 두개의 수를 더하여 결과를 반환하고 반환된 값은 sum변수에 저장*/

 

          System.out.println("입력한 값의 합은 "+sum+"입니다."); 

/*System클래스와 out변수, println() 메소드를 이용하여 문자열을 매개변수로 받아 화면에 출력*/


     }
}

 

 

 

 

 

 

 

 

★객체지향 3 요소 - 캡슐화, 상속, 다형성★

 

▶캡슐화

  - 캡슐화는 크게 2가지 의미를 내포하고 있다.

 

①  “관련된 것들을 캡슐로 한데 모은다”

 

    - 어떤 객체의 속성과 행동을 하나의 클래스에 모아 둔다는 것으로, 이러한 캡슐화를 보통 클래스화(Classification)라고도 한다. 여기서 캡슐이 곧 클래스다.

 

② “캡슐 내부에 들어 있는 것들을 캡슐이라는 보호막으로 보호 한다”

 

   - 캡슐 안에 들어 있는 것들에 대해서 캡슐 외부로부터의 접근을 막는다는 의미로, “클래스 접근 제어” 라고도 한다. Java 언어와 같은 일반 프로그래밍 언어에서는 이러한 역할을 public, protected, private 등의 접근 제어자(access modifier)가 담당한다. 이러한 접근 제어자를 통해서 중요한 속성 및 메서드에 대해서는 외부로부터의 접근을 막고, 필요한 속성과 메서드만 공개하는 것이다.

 

 

캡슐화의 장점 : 응집도 약해짐, 결합도 약해짐, 인터페이스의 단순화, 재사용 용이

 

 

 

 
 
  
 캡슐화 x


여기서 Data 클래스의 속성 value 는 필요에 따라 반드시 x와 y의 덧셈결과를 저장해야 한다고 가정할 때 저런식으로 무방비로 외부로부터 x의 값과 y 의 값이노출되어 있다면, value 속성이 반드시 x와 y의 덧셈결과를 가진다고 보장 할 수 없음
 
캡슐화 o


Data클래스는 중요한 value 속성을 private으로 외부로 부터 보호 시켜놓고 해당 값이 필요한 다른 클래스가 액세스 할 수 있도록 getValue() 메소드를 제공 . 따라서 value 속성은 getValue()메소드를 제외한 다른 경로로는 접근할 수 없게 되고, value 속성이 반드시 x + y 의 결과값을 가져야 한다는것은 보장 받게 됨

 

 

 

 

 


 

 

 

▶상속

 

  - JAVA에서의 상속은, 부모 클래스에 정의된 필드와 메소드를 자식 클래스가 물려받는 것임.

즉, 상속이 이뤄지면 자식클래스는 부모 클래스에 정의된 필드와 메소드를 정의하지 않아도 마치 정의한 것과 같은 효과가 있음

 

 

  - 특성을 물려주는 부모클래스를 super class 라고 하며, 상속받는 클래스를 sub class라고 합니다.

 

 

   상속의 장점 : 클래스 사이의 멤버 중복 선언 불필요                     필드와 메소드 재사용으로 클래스 간결화
                     클래스 간 계층적 분류 및 관리

 

 

예를 들어, 다음과 같은 4가지 클래스 정의한다고 할 때!

 

클래스마다 여러번 필드 혹은 메소드를 입력할필요 없이, 상속을 시켜서 간단하게 처리 할 수 있음

 

 

 

 

이런식으로 상속을 시키면 필드 혹은 메소드들을 중복해서 선언할 필요도없으며,

클래스들 간의 관계가 이해하기 쉽게 되었으며, 계층적으로 분류되어 관리하기도 쉽게 되었음

 

 

▷Object와 super

 

 

 

 

   Object클래스

 

 

       - Object클래스에는 생성자와 메서드만 있음. 상속은 생성자를 제외한 다른 모든 멤버에게서 발생하는 것.

 

   super

 

       - 상속관계에서 자신이 상속한 상위클래스를 지칭할 때 쓰는 말

 

 ☆자바의 생략된 형태들☆

 

* import java.lang.*;

  - 이 패키지를 코딩하지 않아도 자동 인식

 

 

 

* defalut 생성자

 

 

  - 클래스 내부에 아무런 생성자를 만들지 않으면 자동적으로 defalut 생성자가 있다고 인식

 

* this 예약어

 

 

   - 클래스 멤버는 static 멤버를 제외하고 모두 this 객체를 통해 접근하지만 생략할 수 있으므로 일반적으로 사용하지 않아도 인식

 

* 0번째 매개변수

 

 

   - 서로 다른 객체를 구분하기 위해 0번째 매개변수인 "자기클래스명 this"가 생략되어 있음을 인식

 

 

 

* toString() 메서드

 

 

   - 모든 클래스의 객체는 그 이름을 출력에 사용하게 되면 자동적으로 toString() 메서드를 호출

 

 

 

* Object 클래스의 상속

 

 

   - 상속관계가 적혀지지 않은 자바의 모든 클래스는 자동적으로 java.lang.Object 클래스가 상속되었다고 인식

 

 

 

* super 메서드

 

   - 상속관계에서는 하위클래스의 생성자를 첫 라인에 super 메서드나 this 메서드를 기재하지 않았을 때 자동적으로 super가 있다고 인식

 

 

 

 

 

▷상속 선언

 

 

형식 - 상속클래스 지정

 

 





 접근제한자 지정예약어 class 클래스명 extends 상위클래스 {




                     구현부 ;




  }

 

 

 

 

 

 

 

 

 

 

▷자바 상속의 특징

 

 



*자바에서는 다중 상속을 지원하지 않음. 즉 extends 다음에는 오직 하나의 클래스이름 만을 표기할 수 있음
*자바에서는 상속의 횟수에 제한을 두지 않음
*자바에서 계층 구조의 최상위에 있는 클래스는 java.lang.Object 클래스. 이는 자동적으로 컴파일러에 의해 이루어짐

 

 

 

상속 Ex)

 

부모클래스

 

 

자식클래스

 

 

@1 : SuperCL 클래스를 상속받음
@2 : SuperCL 클래스를 상속받았기 때문에 , SuperCL 클래스의 필드임 value를 이 클래스에 선언되어있는것처럼 사용가능
@3 : SuperCL 클래스에만 선언되어있는 getValue() 메소드를 이 클래스에 선언되어있는것처럼 사용가능 

 

 

자식클래스로 생성된 객체 사용 예

 

 

@1 : 자식클래스 객체 생성
@2 : 부모클래스에서 상속받은 setValue()
@3 : 자식클래스에서 생성한 equalize()
@4 : 부모클래스에서 상속받은 i 

 

 

 

 

 

 

 

 

 

▷상속과 접근 지정자

 

 

슈퍼 클래스 멤버에
접근하는 클래스 종류
슈퍼 클래스 멤버의 접근 지정자 
default  private  protected  public 
같은 패키지의 클래스  O  X  O  O 
다른 패키지의 클래스  X  X  X  O 
같은 패키지의 서브클래스  O  X  O  O 
다른 패키지의 서브클래스  X  X  O 

 

 

 

 

★상속은 다형성 구현에 큰 역할을 한다. 상속이 없이는 다형성의 구현이 불가능하기 때문이다★

 

 

 


 

 

▶다형성

 

  - 여러개의 개별적인 클래스를 하나의 부모클래스로 통합 관리하여 그 효율성을 높인 것. 각 클래스의 부모는 같아야 함

 

  - 상속의 관점에서 다형성을 다시 정의하면 “상위 클래스의 좀 더 포괄적인 개념을 이용해서 하위 클래스들에 동일한 방식으로 접근하되, 그 하위 클래스의 특화된 메서드를 실행하는 기법”이라고 할 수 있음

 

 

  - Java 언어와 같은 일반 프로그래밍 언어는 상속, 메서드 오버라이딩(Method Overriding), 레퍼런스 형 변환 등의 기법들을 조합해서 다형성을 구현

 

 

이와같이, B, C 두 개의 클래스가 모두 A라는 클래스로부터 상속을 받는다면 다음과 같이 선언할 수 있음

 

 

 A ap = new A();
 A bp = new B();
 A cp = new C();
*sub 타입의 원리 : A타입이 와야하는 자리에 B나 C타입이 올 수 있다
                            오리지날 타입이 와야하는 자리에 sub타입이 올 수 있다
                            부모 타입이 와야하는 자리에 자식타입이 올 수 있다

 

 

다형성 Ex)

 

 

결과    = >

 

 



  상속을 하지 않았는데 실행됨. => JAVA는 원래 Object 라는 부모타입을 상속받으므로!
 class A3 extneds Object{
 class B3 extends Object{
 public class ThridJavaEx extends Object{


 그리하여 객체생성시 같은 Object 타입(오리지날, 부모)이 와야 하지만
  object[0] = new Object();
  object[1] = new Object();


 다형성을 이유로 Object타입의 sub, 자식타입이 와도 됨
   object[0] = new A3();
   object[1] = new B3();  

 

 

 

 

 

 

 

 

 

 

다형적인 표현에서 멤버에 대한 접근 규정들

 

 



*부모 클래스가 가지고 있는 모든 멤버들에 접근할 수 있다 
  단, 자식 클래스에서 메서드오버라이딩을 했다면 오버라이딩이 된 자식의 멤버에 접근이 된다


*멤버변수의 경우 부모클래스의 멤버변수에만 접근할 수 있다
  자식 클래스의 멤버변수는 오버라이딩이 된 자식 클래스의 메서드에 의해서만 접근할 수 있다

 

 

 

 

 

 

 

 

 

 

 

 

▷다형성 - 멤버변수로의 접근

  변수가 다형성으로 표현되었을 때는 객체를 통해 부모클래스의 멤버변수에 접근가능

 

   - B3으로 객체를 만들었지만 B3이 A3을 상속하고 있으므로 a3로  x의 값 나타낼 수 있음. y의 값 불가

 

 

▷다형성 - 메서드로의 접근

 

   - 다형성 시 오버라이딩 된 자식 메서드가 호출. 자식메서드만 호출시 에러

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참고 : 

http://annehouse.tistory.com/m/473

http://aventure.tistory.com/m/56

http://jhstudynote.tistory.com/m/entry/Java-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-3-%EC%9A%94%EC%86%8C

반응형
Comments