Java(자바) 8日次

블로그 移轉·2022년 11월 2일

Java

목록 보기
8/20

Java 面接 族譜 整理 (8日次)

1. 地域變數에 接近制限子를 붙이지 않는 理由는?

地域變數는 接近制限子를 붙여도 於此彼 範圍가 그 블록 內에서만 使用할 수 있도록 작게 限定되어있기 때문에 接近制限子를 붙여도 意味가 없다。(媒介變數 包含)

2. static變數의 다른 用語 3種類를 말해보시오。

  • static 키워드를 變數 앞에 붙이면 static 變數라고 한다。
    클래스變數共有變數 (C言語에서는 static變數를 靜的變數라고 한다。)
  • static 키워드가 안 붙어 있으면 인스턴스 變數이다。
    (static 키워드는 函數 앞에 붙일 수도 있다。)

3. Java의 메모리領域을 3가지로 나누고、該當領域에 들어가는 情報를 말하여라。

「.class를 어떻게 메모리에 올리는가?」 가 重要한 問題!

C言語는 4個領域(code、data、heap、stack)
Java는 메모리로 올릴 때 元來는 7個領域을 올림。
그러나 只今은 3個만 알고 있으면 된다。

  • method area
    呼出된 클래스(틀)의 메모리 生成、그 안에 데이터 멤버 中 static變數、static函數의 情報(값이 들어있음)
  • call stack
    메인函數 內에 生成되는 客體(메모리 住所를 가리킴)와 呼出되는 函數들이 順次的으로 生成되었다가 使用이 끝나면 使用이 끝나는 順序로(生成된 順序와 反對順序) 削除됨。
  • heap
    客體의 인스턴스 變數와 메소드 情報、static變數를 包含하고 있는 클래스의 住所情報 (同一한 클래스의 客體이고、static變數가 있다면 static變數 情報는 共有된다。
    → 同一 住所 共有

4. static變數의 接近方法은?

클래스 內部接近

static變數가 宣言된 클래스 內에서는 이름만으로 直接 接近 可能

클래스 外部接近

1) private로 宣言되지 않으면 클래스 外部에서도 接近可能
2) 接近 水準 指示子가 許容하는 範圍에서 接近可能
3) 클래스 또는 인스턴스의 이름을 通해 接近

way.num++;

과 같이 인스턴스名으로 接近하는 境遇는 static變數에 接近하는지、인스턴스變數에 接近하는지 저 文章만 보고 把握하기 어렵다。

하지만

AccessWay.num++;

처럼 클래스로 接近하면 static變數에 接近한다는 것을 文章만 보고도 알 수 있다。(클래스名은 첫文字 大文字이기 때문에)

그래서 인스턴스名으로 static變數에 接近하는 것 보다는 클래스名으로 接近하는 것이 더 좋은 方法이다。

  • 內部・外部에서 接近 (例示)

    
     class AccessWay {
    
         static int num = 0;
    
         AccessWay() {
             incrCnt();
         }
    
         void incrCnt() {
             num++;	// 클래스 內部에서 이름을 通한 接近
         }
     }
    
     public class ClassVarAccess {
    
         public static void main(String[] args) {
    
             AccessWay way = new AccessWay();
             way.num++;	// 外部에서 인스턴스名을 通한 接近
             AccessWay.num++;	// 外部에서 클래스名을 通한 接近
             System.out.println("num = " + AccessWay.num);
         }
    
     }
    
  • 클래스變數의 初期化 時點과 初期化 方法(宣言時 初期化가 第一 좋음)

    class InstCnt {
    	static int instNum = 100;	// 클래스變數의 適切한 初期化 位置
      
      	InstCnt() {
      		instNum++;
          	System.out.println("인스턴스 生成 : " + instNum);
      	}
    }
    
    public class OnlyClassNoInstance {
    	public static void main(String[] args) {
      		InstCnt.instNum -= 15;	// 인스턴스 生成 없이 instNum에 接近
          	System.out.println(InstCnt.instNum);
      	}
    }

5. 클래스變數의 活用의 例를 드시오。

共有變數이기 때문에 共有가 重要하다!
인스턴스 別로 가지고 있을 必要가 없는 變數 → static變數 宣言이 좋다。

  • 값의 參照가 目的인 變數
  • 값의 共有가 目的인 變數

그리고 그 값이 外部에서도 參照하는 값이라면 public으로 宣言한다。

  • Math.PI
    public static final double PI = 3.14159265358979323846;
    1) 이 값은 共有가 目的
    2) 이 값은 變하지 않기 때문에 인스턴스 生成時마다 各々 인스턴스 別로 이 값을 가지기 爲해 메모리空間을 잡을 必要가 없다。效率的으로 메모리空間을 活用하기 爲해서는 이런 變數들은 static 宣言을 해 줄 必要가 있다。

static을 붙이면 클래스에 屬하는게 아님 (클래스에서 자리만 빌려 옴)
→ 事實 C言語에서 온거라 客體指向에서는 맞지 않는 表現이긴 하다。

6. static函數에 인스턴스(變數・函數)가 올 수 없는 理由는?

메모리 生成時期가 다르기 때문이다!

static函數는 인스턴스 生成이 없어도 클래스가 스캔되면서 이미 method area에 메모리房이 만들어질 수 있다。

인스턴스變數는 new를 通해서 客體가 만들어져야 變數에 對한 메모리空間 割當이 可能하다。(그래서 instance(客體)變數임)
static函數는 客體生成없이 卽時 使用이 可能하다는 點을 볼 때 아직 客體가 生成되지 않아 메모리割當이 안 된 變數를 使用하는 것은 不可能하기 때문이다。

卽、static函數는 static變數를 使用해야한다。(static變數를 制御(control)하는 것은 static函數이다。)

反面에 인스턴스函數는 static、인스턴스 變數 모두 使用할 수 있는데、static變數가 메모리에 먼저 올라와있기 때문에(메모리生成 時期가 빠름) 呼出할 수 있는 것이다。

7. 인스턴스 函數 內에 스태틱變數와 函數가 올 수 있는 理由는?

인스턴스函數는 static、인스턴스變數와 函數를 全部 使用할 수 있는데、static이 메모리에 먼저 올라와있기 때문에(메모리 生成時期가 빠름) 當然히 둘 다 呼出할 수 있다。

static은 스캔되면 바로 메모리房을 生成하지만 인스턴스變數나 函數는 客體가 生成되어야 메모리가 割當된다。

8. 메소드 오버로딩이란?

同一한 函數名으로 媒介變數(파라미터)의 타입과 個數를 달리해서 函數를 만들 수 있는 것
多重定義

C言語는 同一한 函數名을 使用하는 것 自體가 안 되는데 OOP(Object Oriented Programming)는 같은 函數名을 許容(革命的이었음)한다。

呼出된 메소드를 찾을 때 參照하게 되는 두 가지 情報
→ 메소드名 / 메소드의 媒介變數 情報

따라서 이 둘 中 하나의 形態가 다른 메소드를 定義하는 것이 可能하다。

9. 메소드 오버로딩을 適用한 代表的인 函數는?

System.out.println();

이미 各々의 타입으로 오버로딩되어서 코딩이 되어있기 때문에 使用할 수 있는 것。
使用者가 使用하기 쉽게 encapsulation(캡슐化) 되어있기 때문에 이렇게 오버로딩되어 있는 것이 더 좋다。
(例를 들면 printstring、printchar… 이런 方法보다)

어떤 데이터타입이 와도 같은 機能을 하게될 때는 函數 오버로딩을 適用하는 것이 좋다。

10. 가위바위보 게임을 再次 理解하고 作成하시오。

profile
移轉했읍니다。

1개의 댓글

comment-user-thumbnail
2022년 11월 4일

어려워서 하나도 모르겠는데 한자로 되어있으니까 더 모르겠어요.... 1도 모르겠으니가 그냥 덕담이나 할게요 :< 간바레 준이치상

답글 달기