1. 인스턴스 함수안에 스태틱 변수와 함수가 올 수 있는 이유는?

: JVM 메모리 구조에 의해 .class 파일을 읽어 실행하면 클래스 단위를 읽어옴에 따라 가장 먼저 static 키워드가 붙은 클래스 변수(스태틱 변수)를 읽어 Method Area 영역에 저장된다. 이 후 생성자에 의해 객체가 할당되면 새로 만들어진 인스턴스 또한 생성되어 그에 따라 선언된 인스턴스 함수(변수도 포함)가 heap 영역에 생성되어 Method Area와 Call Stack을 참조한다.

따라서, 이 과정으로 먼저 생성되는 스태틱 변수에 의해 인스턴스 함수안에 스태틱 변수 및 함수가 올 수 있다.

 

 

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

: 호출된 메소드를 찾을 때 참조하게 되는 두 가지 정보인 메소드 이름과 메소드의 매개변수를 통해 메소드 이름이 중복되어도 매개변수의 정보를 달리하여 정의 하는 것을 의미한다.

void method(int n) { ... } 
void method(int n1 , int n2) { ... } // 매개변수의 수가 달라 메소드 오버로딩이 성립한다.

void method(int n) { ... } 
void method(double n) { ... } // 매개변수의 타입이 달라 메소드 오버로딩이 성립한다. 

int method() { ... } 
double method() { ... } // 단, 반환형 타입이 다르면 메소드 오버로딩이 성립하지 않는다.

또한, 생성자의 파라미터를 달리하여 생성자 메소드 또한 오버로딩을 할 수 있다.

// 메인 클래스 
Person jung = new Person (335577, 112233); 
Person hong = new Person (775544); // 파라미터(pnum) 하나가 없음. 


// Person 클래스 
private int rnum, pnum; 

Person (int rnum, int pnum) { 
	regiNum = rnum; 
	passNum = pnum; 
} 

Person (int rnum) { // pnum을 입력하지 않았을 경우. 메소드 오버로딩 
    regiNum = rnum; 
    passNum = 0; // 값을 0으로 초기화한다. 
}

 

 

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

: System 클래스에 속하는 println() 메소드가 있으며, 해당 함수를 정의할 때 여러 데이터 타입(원시 타입, 참조 타입 포함)을 고려하여 메소드 오버로딩을 적용하였다.

System.out.println(123); // int 타입 
System.out.println(123L); // long 타입 
System.out.println(123.456); // double 타입 
System.out.println(123.456f); // float 타입 
System.out.println('가'); // char 타입 
System.out.println("가나다"); // String 타입 
System.out.println(); // Object 타입

 

 

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

: 자신의 객체를 참조하는 메소드로, 오버로딩 된 다른 생성자를 호출하여 코드의 중복을 줄인다.

// this 함수를 사용하지 않을 때 
Person(int rnum) { 
    regiNum = rnum; 
    passNum = 0; 
} 

// this 함수를 사용할 때 
Pserson(int rnum) { 
  	this(rnum, 0); // this 함수 
}

 

5. this란 무엇인가?

: 자신의 객체를 참조하는 키워드로 코드의 중복을 줄이기 위해 사용된다.

// 클래스의 속성과 생성자 및 메소드의 파라미터 이름이 같은 경우 
public class SubClass { 
    private int num; 

    public SubClass(int num) {
    	this.num = num; // this 키워드로 변수 선언시 중복 해결 
    } 
}
// 클래스에 오버로딩된 다른 생성자 호출 
public class SubClass { 
    private int num, nom;
    
    public SubClass(int num) { 
    	this(num, 0); // this 키워드를 통해 메소드 오버로딩하여 호출. (4번, this 함수 참조) 
    } 

    public SubClass(int num, int nom) { 
    	this.num = num; this.nom = nom; 
    } 
}
// 객체 자신의 참조 값 전달
public class SubClass {
    private int num;

    public SubClass(int num) {
    	this.num = num;
    } 

    public SubClass getSubClassInstance() { 
    	return this; // this 키워드로 리턴 값 전달 
    } 
}

 

 

6. 스트링 객체를 생성하는 2가지 방법은? 아래의 결과를 예측하고,이유를 설명하시오.

String str1 = "Simple String"; 
String str2 = "Simple String"; 
String str3 = new String("Simple String");
String str4 = new String("Simple String"); 

if(str1 == str2) 
	System.out.println("str1과 str2는 동일 인스턴스 참조"); 
else 
	System.out.println("str1과 str2는 다른 인스턴스 참조");

if(str3 == str4)
	System.out.println("str3과 str4는 동일 인스턴스 참조");
else
	System.out.println("str3과 str4는 다른 인스턴스 참조");

 

> str1과 str2는 동일 인스턴스 참조 
> str3과 str4는 다른 인스턴스 참조

: 위 코드를 참조하였을 때 String 객체를 생성하는 2가지 방법은 다음과 같이 추론 할 수 있다.

  1. 문자열을 통해 초기화 하여 바로 변수를 선언하는 방식
  2. 생성자를 통해 객체를 생성하여 변수를 선언하는 방식

1번의 경우, 생성한 str1과 str2를 if 조건문에 비교(==) 하였을 때 둘은 각각의 객체를 비교하고 있다.(Call by Reference) 여기서 str1과 str2는 서로 다른 이름의 변수로 생성되었지만 값(“Simple String”)이 서로 같기에 immutable 특성을 가진 String 클래스로 인해 중복값이 있을경우 하나의 인스턴스로 처리하여 주소 값이 같아지게 되어 str1과 str2는 동일 인스턴스 참조를 출력할 것이다.

2번의 경우, 생성한 str3와 str4를 if 조건문에 비교(==) 하였을 때 1번과 똑같이 각각의 객체를 비교하고 있다. 그러나 위와 달리 str3와 str4는 각각 생성자(new)를 통해 객체를 할당하여 서로 다른 인스턴스를 생성하였기 때문에 주소 값이 달라 str3과 str4는 다른 인스턴스 참조를 출력할 것이다.

 

 

7. immutable 에 대하여 설명하시오.

: immutable은 사전명으로 ‘불변하지 않는’으로 Java에선 Immutable 클래스를 일컫는다.

이 클래스는 변경이 불가하고 가변적이지 않는 특성을 지니며, 인스턴스의 특성상 다른 클래스들 처럼 heap 영역 메모리에 생성된다.

다만, 다른 인스턴스와의 결정적인 차이는 전역변수에서 final 키워드를 추가하여 선언하고, setter 매소드를 구현하지 않는다는 점이 있다.

그로인해, 별다른 생성자(new) 없이 선언이 가능하고 멀티스레드 환경에서 동기화 처리없이 객체를 공유할 수 있는 이점을 가지지만 객체가 가지고 있는 값마다 새로운 객체를 생성하는 특성을 가지고 있어 장기적으로 성능저하를 일으키는 원인 중 하나가 된다.

String str1 = "Hello"; 
String str2 = Str1 + "Hello2"; // immutable 특성으로 인해 중복 값을 배제한다.

 

> HelloHello2

 

 

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

8-1. 메인 클래스

import java.util.Scanner; 

public class EnglishStringMain { 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); 
        
        System.out.print("영어 문자열을 입력해주세요: ");
        String input = scanner.next(); 
        
        EnglishString engstr = new EnglishString(input);
        engstr.show();
        
        scanner.close();
    }
}

 

8-2. 영문 자음 모음 개수 계산 클래스

import java.util.regex.Pattern; 

public class EnglishString { 
    private String input; 

    public EnglishString(String input) { 
    	this.input = input; 
    } 

    public String getInput() { 
    	return input; 
    } 

    public void setInput(String input) { 
    	this.input = input; 
    } 

    public boolean isAlpha(String input) { // 알파벳 유효성 검사
    	return Pattern.matches("^[a-zA-Z]*$", input);
    } 

    public void show() { 
    	int vcnt = 0; // 모음 
    	int ccnt = 0; // 자음 
    	input = input.toLowerCase(); // 대문자 -> 소문자 변환 

        for (int i = 0; i < input.length(); i++) {
            if (input.charAt(i) == 'a' // char로 캐스팅하여 문자 비교 
              || input.charAt(i) == 'i' 
              || input.charAt(i) == 'u' 
              || input.charAt(i) == 'e' 
              || input.charAt(i) == 'o') { 
                vcnt++; 
            } else { 
                ccnt++; 
            } 
        } 
        
        System.out.println("모음 수: " + vcnt); 
        System.out.println("자음 수: " + ccnt); 
    } 
}

 

 

9. 사용자로부터 키를 입력받아서 표준 체중을 계산한 후에 사용자의 체중과 비교하여 저체중인지, 표준인지, 과체중인지를 판단하는 프로그램을 작성하라. 표준 체중 계산식은 다음을 사용하라.

표준체중 = ( 키 - 100 ) * 0.9

 

9-1. 메인 클래스

import java.util.Scanner; 

public class BMIMain {
    public static void main(String[] args) { 
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("당신의 키를 입력해주세요[cm]: "); 
        double height = scanner.nextDouble(); 
        System.out.print("당신의 몸무게를 입력해주세요[kg]: ");
        double weight = scanner.nextDouble();

        BMI bmi = new BMI(height, weight); 
        bmi.show(); 

        scanner.close();
    } 
}

 

9-2. BMI 계산 클래스

public class BMI { 
    private double height, weight; 

    public BMI(double height, double weight) { 
    	this.height = height; this.weight = weight; 
    }

    public double getHeight() {
    	return height; 
    } 

    public void setHeight(double height) {
    	this.height = height;
    }

    public double getWeight() {
    	return weight; 
    } 

    public void setWeight(double weight) { 
    	this.weight = weight;
    }

    private double sndWei() { // 표준체중 계산 메소드 
    	return (height - 100) * 0.9; 
    }

    public void show() { 
        System.out.println("당신의 표준체중은 " + Math.round(sndWei()) + "kg 으로");

        if (weight == sndWei()) { 
        	System.out.println("표준 체중 입니다."); 
        } else if (weight > sndWei()) {
        	System.out.println("과체중 입니다.");
        } else { 
        	System.out.println("저체중 입니다.");
        } 
    } 
}

 

 

10. 2와 100 사이에 있는 모든 소수(prime number)를 찾는 프로그램을 작성하라. 주어진 정수 k를 2부터 k-1까지의 숫자로 나누어서 나머지가 0인 것이 하나라도 있으면 소수가 아니다.

10-1. 메인 클래스

import java.util.Random; 

public class PrimeMain { 
    public static void main(String[] args) { 
        Random random = new Random(); 
        
        int rnum = random.nextInt(100) + 2; // 2 ~ 100 난수 생성
        
        Prime prime = new Prime(rnum); 
        prime.show();
    } 
}

 

10-2. 소수 계산 클래스

public class Prime { 
    private int rnum;

    public Prime(int rnum) { 
    	this.rnum = rnum;
    } 

    public int getRnum() {
    	return rnum;
    } 

    public void setRnum(int rnum) { 
    	this.rnum = rnum;
    } 

    public void show() { 
        System.out.println("임의의 정수는 " + rnum + " (으)로"); 
        System.out.print("소수는 "); 

        for (int i = 2; i <= rnum; i++) {
            boolean isPrime = true; 
            
            for (int j = 2; j*j <= i; j++) {
                if (i % j == 0) { 
                	isPrime = false; break;
                } 
            } 

            if (isPrime) { 
            	System.out.print(i + " "); 
            }
        }
        
        System.out.println("입니다."); 
    }
}

 

 

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

입력:abcde
출력:edcba

 

11-1. 메인 클래스

import java.util.Scanner; 

public class TebahplaMain { 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); 

        System.out.println("영어 문자열을 입력해주세요.");
        String input = scanner.next(); 
        
        Tebahpla tebahpla = new Tebahpla(input);
        tebahpla.show();
        
        scanner.close();
    } 
}

 

11-2. 문자열 역순 알고리즘 클래스

import java.util.regex.Pattern; 

public class Tebahpla { 
    private String input;

    public Tebahpla(String input) {
    	this.input = input;
    } 

    public String getInput() {
    	return input;
    }

    public void setInput(String input) {
    	this.input = input; 
    }

    public boolean isAlpha(String input) { // 알파벳 유효성 검사 
    	return Pattern.matches("^[a-zA-Z]*$", input); 
    } 

    public static String reverseString(String input) { // StringBuffer.reverse를 이용하여 문자열 뒤집기
    	return ( new StringBuffer(input) ).reverse().toString(); 
    }

    public void show() { 
    	System.out.println(reverseString(input) + " 으로 출력되었습니다.");
    }
}

'WebDev > 본과정' 카테고리의 다른 글

배열의 탐색 및 정렬  (0) 2021.05.12
String 클래스의 메소드 및 배열 기초  (0) 2021.05.12
캡슐화와 static 키워드  (0) 2021.05.11
패키지와 접근제한자  (0) 2021.05.11
클래스의 생성자  (0) 2021.05.11