IT 면접족보/자바 면접족보

자바 면접 족보 정리(10일 차 )

낙산암 2020. 12. 8. 06:14

1.아래의 접근제한자에 대하여 설명하시오.

-private

-protected

-default

-public

 

public > protected > default > private

 

각각의 접근 제한자는 변수, 메소드, 클래스의 **접근 권한을 제한**하기 위해서 사용되며, 변수, 메소드, 클래스 이름의 맨 앞에 해당 키워드를 붙여 사용한다. (default는 아무것도 안붙임)

 

###private

 

- 인스턴스 변수와 메소드 대상 접근 수준 지시자

- 같은 클래스 내에서만 접근 가능하다.

 

= 외부에서 . 으로 데이터 멤버에 직접 접근할 수 없다. **(정보 은닉)**

 

Ex) c.rad =- 3.3; 처럼 c가 참조하는 인스턴스 멤버 rad에 직접 접근할 수 없다.

 

- 메소드를 통한 변수의 접근: 데이터를 private으로 선언하고 끝냈을 때 의미가 있는 경우도 있지만, 외부에서 접근해서 쓸 수 있어야 하기 때문에 값을 가져가기 위한 getter, 값을 저장 수정하기 위한 setter함수를 public으로 선언해서 이런 기능을 통해 접근하게 함. 이렇게 하면 잘못된 값이 전달 됐을 때 대처 방법을 마련할 수 있어 안정성이 높아진다. (논리적 오류를 컴파일 오류로 이어지게 할 수 있음)

그 외에 여러 자동화 장치도 넣어줄 수 있다.

- 사용 예시:

 

private int num1; // 인스턴스 변수

private void Circle(){...} // 메소드

 

 

### (default)

 

- 인스턴스 변수와 메소드 + 클래스 정의 대상 접근 수준 지시자

- 동일 패키지로 묶인 클래스 내에서만**(같은 패키지 내에서만) 접근이 가능하고, 인스턴스 생성을 허용한다.

- 이름 앞에 접근제한자를 붙이지 않으면 defalut이다.

 

= 아무 선언도 하지 않은 것, **default는 키워드가 아니다.**

 

- 디폴트 패키지는 패키지 선언이 되어 있지 않은 클래스들을 하나의 패키지로 묶기 위한 개념이다.

- 사용 예시: (키워드 안붙임)

 

 

class Circle {...} // 클래스

 

int num2; // 인스턴스 변수

void Circle(){...} // 메소드

 

 ###protected

 

- 인스턴스 변수와 메소드 대상** 접근 수준 지시자

- 다른 패키지에 있더라도 상속받은 클래스에서는 접근 가능하다.

- 사용 예시:

 

protected int num3; // 인스턴스 변수

protected void Circle(){...} // 메소드

 

- 상속

 

public class AAA {

int num;

}

 

 

ZZZ extends AAA (AAAZZZ가 상속하겠다.)

 

 

// extends AAAAAA 클래스의 상속을 의미함

public class **ZZZ extends AAA** {

public voidinit (int n){

num = n; // 상속된 변수 num 의 접근

}

}

 

 

### public

 

- 인스턴스 변수와 메소드 + 클래스 정의 대상** 접근 수준 지시자

- 모든 파일에서 접근 가능**, **어디서든** 인스턴스 생성이 가능하다. (접근을 제한하지 않음)

- public 클래스****외부에 노출시키기 위한 클래스**이다.

 

= 열어보지 않아도 파일 이름만으로 내용을 유추할 수 있어야한다.

 

= 하나의 소스코드에는 하나의 public 클래스만 만들 수 있다.

 

= public 클래스의 이름은 .java의 이름과 동일해야한다.

 

- private으로 선언된 데이터 멤버를 외부에서 활용하기 위해 getter, setter 같은 함수를 public으로 선언해서 사용한다.

- 사용 예시 :

 

 

public class ZZZ {...} // 클래스 ZZZ.java

 

public int num4; // 인스턴스 변수

public static void main(String[] args){...} // 메소드

2.지역변수에 접근제한자를 붙이지 않는 이유는?

지역변수는 접근 제한자를 붙여도 어차피 범위가 그 블록 안에서만 사용할 수 있도록 작게 한정되어 있기 때문에 접근제한자를 붙여도 의미가 없다. (매개변수 포함)

3.캡슐화에 대하여 설명하시오.

객체지향 언어의 특징

(Java는 객체지향 언어! (반대는 절차지향 언어_c언어))

1) 정보은닉 information hiding 
2) 상속 inheritance 3) 다형성 polymorphism (중요! 70%)
4) 캡슐화 encapsulation (+ 추상화 abstraction)

 

최종 소비자가 가장 쓰기 쉽게 간편하게,

최소한의 비용으로 최대한의 퍼포먼스를 얻을 수 있게 만드는 것! (프로그램을 잘 짜는 최종 목표!!)**

 

비슷한 기능을 가진 클래스를 여러 개 사용할 때 그 각각의 클래스를 따로따로 불러 와서 사용하게 되면 순서, 정보가 정리되지 않아 코드가 복잡해진다. 따라서 그 클래스들을 깨서 사용하려는 기능을 중심으로 비슷한 것끼리 다시 하나의 클래스로 묶어 주면 더욱 간결한 코드를 만들 수 있다. (관련된 것들을 한곳에 적절히 잘 담는 것)

 

최종적으로 사용할 때는 최소한의 로직(함수 호출 등)으로 사용할 수 있게 하는 것을 말한다. , **사용자는 캡슐 안의 상세한 내용을 잘 모르더라도 함수 하나만 호출하면 잘 돌아갈 수 있게 만드는 것이 핵심**이다.

 

(감기약 take 함수 예시)

 

+

클래스는 각각의 역할을 가지고 있다. 그런데 그 일부 내용이나 기능을 다른 클래스로 잘못 옮기게 되면 캡슐화가 무너지게 된다. 각각 자기가 맡은 역할을 제대로 담당하고 있으면 캡슐화가 잘 된다고 말할 수 있다.

+

책에 따라 캡슐화는 정보은닉과 같은 의미로 사용되기도 한다.

4. 랜덤 숫자 맞추기 게임을 짜시오.

 

5.static 변수의 다른 용어 3가지를 말해 보시오.

static 키워드를 변수 앞에 붙이면 static 변수 라고 한다.

클래스 변수, 공유 변수** (c언어 에서는 static 변수를 **정적 변수**라고 함)

static 키워드가 안 붙어 있으면 인스턴스 변수이다.

(static 키워드는 함수 앞에 붙일 수 도 있다.)

6.자바의 메모리 영역을 3가지로 나누고, 해당 영역에 들어가는 정보를 말하여 보시오.

.class를 어떻게 메모리에 올리는가? 가 중요한 문제!

 

C언어는 4개 영역(code, data, heap, stack) 자바는 메모리로 올릴 때 원래는 7개 영역을 올림. 그러나 지금은 3개만 알고 있으면 된다.

 

1) method area

호출된 클래스(틀)의 메모리 생성, 그 안에 데이터 멤버 중 static 변수, static함수의 정보(값이 들어 있음)

2) call stack

메인함수 안에 생성되는 객체(메모리 주소를 가리킴)와 호출되는 함수들

순차적으로 생성 되었다가 사용이 끝나면 사용이 끝나는 순서로(생성된 순서와 반대 순서) 삭제됨

3) heap

객체의 인스턴스 변수와 메소드 정보, static 변수를 포함하고 있는 클래스의 주소 정보 (동일한 클래스의 객체이고, static 변수가 있다면 static 변수 정보는 공유: 같은 주소 공유)

 

메모리

7.static 변수의 접근 방법은?

클래스 내부 접근

static 변수가 선언된 클래스 내에서는 이름만으로 직접 접근 가능

 

### 클래스 외부 접근

 

- private 으로 선언되지 않으면 클래스 외부에서도 접근 가능

- 접근 수준 지시자가 허용하는 범위에서 접근 가능

- 클래스 또는 인스턴스의 이름을 통해** 접근

 

way.num++; 과 같이 인스턴스 이름으로 접근하는 경우는 static변수에 접근하는지, 인스턴스 변수에 접근하는지 저 문장만 보고 파악하기 어렵다.

 

하지만 AccessWay.num++; 처럼 클래스 이름으로 접근하면 static변수에 접근한다는 것을 문장만 보고도 알 수 있다.(클래스 이름은 첫 문자 대문자이기 때문에)

 

그래서 인스턴스 이름으로 static변수에 접근하는 것 보다는 클래스 이름으로 접근하는 것이 더 좋은 방법이다.

 

- 수업시간 예시: 내부, 외부에서 접근

- 수업시간 예시: 클래스 변수의 초기화 시점과 초기화 방법(선언시 초기화가 가장 좋음)

8.클래스 변수의 활용의 예를 드시오.

공유변수기 때문에 공유가 중요하다!! 

인스턴스 별로 가지고 있을 필요가 없는 변수 → static 변수 선언이 좋다.

  • 값의 참조가 목적인 변수

  • 값의 공유가 목적인 변수

그리고 그 값이 외부에서도 참조하는 값이라면 public으로 선언한다.

1) Math.PI

public static final double PI = 3.14159265358979323846;

  1. 값의 공유가 목적이며 2) 이 값은 변하지 않기 때문에 인스턴스 생성 시마다 각각 인스턴스 별로 이 값을 가지기 위한 메모리 공간을 잡을 필요가 없다. 효율적으로 메모리 공간을 활용하기 위해서는 이런 변수들은 static 선언을 해 줄 필요가 있다.

static 붙이면 클래스에 속하는게 아님 (클래스에서 자리만 빌려 옴):

사실 C언어에서 온거라 객체지향에서는 맞지 않는 표현이긴 함

9.스태틱 함수에 인스턴스 변수가 올수 없는 이유는?

메모리 생성 시기가 다르기 때문이다!

 

static 함수는 인스턴스 생성이 없어도 클래스가 스캔 되면서 이미 method area에 메모리 방이 만들어 질 수 있다. 인스턴스 변수는 new를 통해서 객체가 만들어져야 변수에 대한 메모리 공간 할당이 가능하다.(그래서 인스턴스 변수임) static 함수는 객체 생성 없이 바로 사용이 가능하다는 점을 볼 때 아직 객체가 생성되지 않아 메모리 할당이 안된 변수를 사용하는 것은 불가능 하기 때문이다. , static함수는 stiatc 변수를 사용 해야 한다. (static변수를 컨트롤 하는 것은 static함수이다.

 

반면에 인스턴스 함수는 static, 인스턴스 변수 모두 사용할 수 있는데, static변수가 메모리에 먼저 올라와 있기 때문에(메모리 생성 시기가 빠름) 호출할 수 있는 것이다.

 

10.아래의 프로그램을 작성 하시오.

 

다음 멤버를 가지고 직사각형을 표현하는 Rectangle 클래스를 작성하라.

 

- int 타입의 x, y, width, height 필드: 사각형을 구성하는 점과 크기 정보

- x, y, width, height 값을 매개변수로 받아 필드를 초기화하는 생성자

- int square() : 사각형 넓이 리턴

- void show() : 사각형의 좌표와 넓이를 화면에 출력

- boolean contatins(Rectangle r) : 매개변수로 받은 r이 현 사각형 안에 있으면 true 리턴

- main() 메소드의 코드와 실행 결과는 다음과 같다

public static void main(String[] args) {

Rectangle r = new Rectangle(2, 2, 8, 7);

Rectangle s = new Rectangle(5, 5, 6, 6);

Rectangle t = new Rectangle(1, 1, 10, 10);

 

r.show();

System.out.println("s의 면적은 "+s.square());

if(t.contains(r)) System.out.println("tr을 포함합니다.");

if(t.contains(s)) System.out.println("ts를 포함합니다.");

}

(2,2)에서 크기가 8x7인 사각형

s의 면적은 36

tr을 포함합니다.

 

사각형 좌표

public class Rectangle {
	private int x, y, width, height;
	private int x2, y2;

	public Rectangle(int x, int y, int width, int height) {
		this.x = x;
		this.y = y;
		this.width = width;
		this.height = height;
	}
	
	+getter, stetter추가할것

	public int square(){
		return width * height;
	}
	
	public void show() {
		System.out.println("("+x + ","+y+")에서 크기가 "+width+"x"+height+"인 사각형");
	}
	
	public boolean contains(Rectangle compare) {
		this.x2 = x + width;
		this.y2 = y + height;
		
		if((this.x < compare.x) && (this.y2 > compare.y2) && (this.x2 > compare.x2) ){  //x=y 값이 같아서 시작값은 x만 비교함
			return true;
		}else
			return false;	
	}
}