본문 바로가기

bitcamp/면접족보

면접족보 20/12/07_메소드 오버로딩

1. 인스턴스 함수에 클래스 변수와 함수가 접근 할 수 있는 이유는?

· 클래스 변수와 함수는 미리 메모리에 저장되어 있는 상태이기 때문에 Call Stack 영역에 저장되는 인스턴스 함수에는

 접근이 가능하다.(메모리에 static이 먼저 올라가기 때문!)

 

 

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

· 같은 class 내에서 사용하려는 메소드 명이 이미 존재하는 경우, 파라미터(매개변수)의 수가 다르거나 데이터 타입이 다른 경우

 컴파일 오류가 발생하지 않는다. (같은 메소드 명을 매개변수의 타입과 개수를 달리하여 사용)

· why? 메소드 명이 같을 때 매개변수의 수와 데이터 타입이 다르기 때문에 컴파일 시 구분이 가능해진다.

· ex)

 

 

3. 메소드 오버로딩을 적용한 대표적인 함수는?

· println(), 아래와 같이 데이터 타입마다 코딩을 따로 해두었기 어떠한 값을 넣어도 오류가 발생하지 않으며,

 매개변수의 수 혹은 데이터 타입을 통해 구분하여 컴파일을 실행한다.

· ex)

 

· out.println()을 printlnString(""); 으로 설정을 하지 않은 이유?

 타입을 확정해두면 타입에 맞게 사용해야 하기 때문에 사용자에게 편리성을 제공하기 위함으로,

 String을 제외하고는 각각의 타입에 맞게 코딩이 되어 있어 함수만 호출하여도 사용이 가능하다.

 (java의 기능 중 하나인 캡슐화의 기능이 적용된 예이며, c언어에서는 적용되지 않는다)

 

오버로딩과 오버라이딩 차이점 반드시 기억할 것!!!

 

 

 

4. this와 this 함수에 대하여 설명하시오.

· this란? 메소드 내에 동일한 변수명이 있더라도 변수명 앞에 this를 표기한다면 인스턴스 변수를 의미한다.

· ex) this.data는 인스턴스 변수 data를 의미

· this 함수란? 자기 자신의 생성자를 호출함으로서 생성자의 초기화 과정을 생략해주는 함수이다.

· ex) rnum과 0을 인자로 받는 오버로딩 된 생성자를 호출하여 초기화 시키며, 중복된 코드를 줄인다.

 

 

5. 아래의 결과를 예측하고,이유를 설명하시오.

· 결과 예측 

  str1과 str2는 동일 인스턴스 참조

  str3과 str4는 다른 인스턴스 참조

· "Simple String"가 메모리에 저장될 때, 대소문자/spelling이 모두 같다면 그 자체를 동일하게 판단하여 한 개의 인스턴스만 생성하기 때문에 str1과 str2는 동일한 인스턴스를 참조한다.(따옴표" "를 상수로 인식) 

  만약 str2가 "simple String" 이라면 s의 대소문자가 다르기 때문에 str1과 str2는 다른 인스턴스를 참조한다.

· str3과 str4는 new를 선언하여 아예 다른 객체를 생성하므로 다른 인스턴스를 참조한다. 

· 객체 확인이 아닌 단순히 "Simple String"이 같은 글인지 확인하고 싶다면 equals 함수를 이용하여 확인이 가능하다. 

  ex) if(str1.equals(str3)) → true 반환

 

 

 

6. Immutable 에 대하여 설명하시오.

· Mutable class: 인스턴스 생성된 후에 값의 내용이 변할 수 있는 클래스이다.

· Immutable class: 인스턴스 생성된 후에는 인스턴스의 내용이 절대 변하지 않는 클래스이다.(String)

· ex) 출력→ HelloHello2 

 s는 Hello를 참조하고 있으며, 원래의 값을 변경 할 수 없다는 불변의 의미를 가진 Immutable은 s가 아닌 Hello를 일컫는다.

 Hello는 절대 변할 수 없으므로, s = s + "Hello2"의 연산이 이루어지면 원래 참조하던 Hello에 연산이 되는게 아닌 새로운 객체를 생성하여 아래와 같이 HelloHello2를 참조하게 된다.

 

 

7. 사용자로부터 받은 영문에서 자음과 모음 개수를 계산하는 프로그램을 작성하라.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Aeiou {
    private String s;
    private int i, m = 0;
    
    public String getS() {
        return s;
    }
    public void setS(String s) {
        this.s = s;
    }
 
    public void getMcnt() {
        String s1 = s.toUpperCase();
        for (i = 0; i < s1.length(); i++) {
            if (s1.charAt(i) == 'A' || s1.charAt(i) == 'E' || s1.charAt(i) 
                    == 'I' || s1.charAt(i) == 'O' || s1.charAt(i) == 'U')
                m++;
        }
        System.out.println("모음 개수: " + m);
        System.out.println("자음 개수: " + (s1.length() - m));
    }
}
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
class Aeioumain {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Aeiou aeiou = new Aeiou();
        
        System.out.println("영문을 입력해주세요.");
        String s = sc.next();
        aeiou.setS(s);
        aeiou.getMcnt();
    }
}
 


cs

 

8. 사용자의 체중과 비교하여 저체중/표준/과체중인지를 판단하는 프로그램을 작성하라.

   (사용자로부터 키를 입력받아 표준 체중 계산)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//표준 체중 계산식은 다음을 사용하라.
//표준체중 = ( 키 - 100 ) * 0.9
 
class Weight {
    private int kg, cm;
 
    public int getKg() {
        return kg;
    }
    public void setKg(int kg) {
        this.kg = kg;
    }
    public int getCm() {
        return cm;
    }
    public void setCm(int cm) {
        this.cm = cm;
    }
    public void getVal() {
        double sw = (cm - 100* 0.9;
        if (sw == kg) {
            System.out.println("표준체중입니다.");
        } else if (sw > kg) {
            System.out.println("저체중입니다.");
        } else
            System.out.println("과체중입니다.");
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Weightmain {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Weight w = new Weight();
        
        System.out.println("체중을 입력해주세요.");
        int kg = sc.nextInt();
        System.out.println("신장을 입력해주세요");
        int cm = sc.nextInt();
        
        w.setKg(kg);
        w.setCm(cm);
        w.getVal();
    }
}
cs

 

9. 2와 100 사이에 있는 모든 소수(prime number)를 찾는 프로그램을 작성하라.

  cf) 주어진 정수 k를 2부터 k-1까지의 숫자로 나누어서 나머지가 0인 것이 하나라도 있으면 소수가 아니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Num{
    public static void main(String[] args) {
        int count = 0;
            for(int k = 2; k <= 100; k++){
                for(int n = 2; n <= k; n++){
                    if(k % n == 0) {
                       count++;
                    } 
                if(count == 1) {
                    System.out.println(k);
                }
                count=0;
          }            
     }
 }
 
cs

 

 

10. 사용자에게 받은 문자열을 역순으로 화면에 출력하는 프로그램을 작성하시오.

1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//입력:abcde
//출력:edcba
 
class Reversewords {
    public static void main(String[] args) {
        String words;
 
        Scanner sc = new Scanner(System.in);
        words = sc.next();
 
        for (int i = words.length() - 1; i >= 0; i--) {
            System.out.print(words.charAt(i));
        }
    }
}
cs

 

 

2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Reverse {
    private String words;
 
    public Reverse() {
    }
    
    public Reverse(String words) {
        this.words = words;
    }
    public String getWords() {
        return words;
    }
    public void setWord(String words) {
        this.words = words;
    }
    public void input() {
        Scanner sc = new Scanner(System.in);
        System.out.println("입력할 단어를 넣으세요.");
        words = sc.next();
        sc.close();
    }
    public void reversePrint() {
        if (words == null) {
            System.out.println("단어 입력이 안되었습니다.");
            return;
        }
        for (int i = words.length() - 1; i >= 0; i--) {
            System.out.print(words.charAt(i));
        }
    }
}
cs
1
2
3
4
5
6
7
class Reversemain {
    public static void main(String[] args) {
        Reverse reverse = new Reverse();
        reverse.input();
        reverse.reversePrint();
    }
}
cs