JAVA/Study

[0128] 3. Wrapper 클래스, static 메서드, 메서드 문법

1) 래퍼 클래스 (Wrapper Class)

1.1 기본 자료형을 객체로 다루기 위해 사용되는 클래스를 의미한다.

    - JDK 5 버전부터 지원되며 Autoboxing, Unboxing 기능을 제공.

    - Autoboxing : 일반 자료형의 값을 래퍼 클래스로 대입해준다.

    - Unboxing : 래퍼 클래스가 가진 값을 일반 자료형으로 변경해준다.

    - Autoboxing, Unboxing 은 컴파일러에서 코드를 변경하여 바이트 코드를 생성해주는 것 (편리한 코딩!)

1.2 래퍼 클래스의 종류 및 내부 함수

    - 종류 : Byte, Character, Short, Integer, Long, Float, Double, Boolean

    - Integer.parseInt("10") : Integer 래퍼클래스의 내부 함수(static)를 이용하면 문자열을 int형으로 반환.

 

2) 메서드 (Method)

2.1 static 메서드

    - 클래스 객체를 생성하지 않아도 사용이 가능한 메서드이다.

    - 클래스명.메서드명() 으로 사용하며 static이 아닌 멤버 변수는 사용 할 수 없다.

    - Integer.intValue() : 클래스 내부에 저장 된 int 자료형 값을 반환해준다.

    - Integer.valueOf("100") : 생성자를 사용하지 않고 정수나 문자열을 Integer 클래스로 반환 받을 수 있다.

2.2 메서드 문법

    - [접근제한자][static][반환형][메서드 이름](자료형 지역변수, 자료형 지역변수2)

    - StringBuffer, StringBuilder 클래스 : 문자열을 담을 수 있는 버퍼 클래스 (받는 문자열 크기를 자동 확장)

    - 객체 지향 재사용성 목적에 맞게 UI와 비지니스 로직을 분리하는 것이 좋다.

    - 메서드는 고유 영역이며 메서드안에 또 다른 메서드를 포함되면 안된다.


소스 코드

package ex1;

public class Ex1_Wrapper {
    public static void main(String[] args) {
        // 기본 타입(primitive type)과 참조 타입(reference type)
        // 풀이) 생성 된 객체의 주소.(.의 의미 > 참조해서 찾아가라)
        // 그 객체가 가지고 있는 자원(메서드, 속성)을 호출 및 사용
        System.out.println("Test".getBytes());
        
        // 기본 자료 타입(primitive type)을
        // 객체로 다루기 위해서 사용하는 클래스들을
        // 래퍼 클래스(wrapper class) 라고 합니다.
        
        int num = 10;
        // wrapper class (Integer)
        // jdk 5.0 이상부터 AutoBoxing , UnBoxing을 제공한다.
        // AutoBoxing -> 일반 자료형을 Wrapper 클래스로 변경한다.
        // Integer num1 = new Integer("10");
        // Integer num2 = new Integer("10");
        
        Integer num1 = 10;
        Integer num2 = 10;
        System.out.println(num1.shortValue());
        System.out.println(num1 == num2);
        
        // 범용적인 사용 예
        String number1 = "19";
        
        // int ageNum = new Integer(number1);
        // Integer 객체를 힙에 생성시키지 않고 바로 스택에서 문자열 정수를 정수값으로 반환        
        int ageNum = Integer.parseInt(number1);
        System.out.println("agenum : " + (ageNum >= 19));
        
        // ----------- jdk 5.0버전부터
        Integer ageNum2 = new Integer("10");    // Integer 객체로 생성한 것
        int res = ageNum2.intValue();           // 일반 자료형
        System.out.println(ageNum2);
        System.out.println(res);
        // jdk 5.0버전부터 UnBoxing -> Wrapper 클래스를 일반 자료형으로 변경한다.
        int ageNum3 = new Integer("10");

        // 연습문제) Wrapper 클래스의 종류를 찾아서 AutoBoxing , UnBoxing을 실습해봅시다.
        // 예시)
        System.out.println("--------------------------------");
        Boolean b1 = true;
        String b1str = b1.toString();
        System.out.println("Boolean AutoBoxing 실습 : " + b1str);
        boolean b2 = b1;
        System.out.println("Boolean UnBoxing 실습 : " + b2);
        
        System.out.println("--------------------------------");
        Byte by1 = 10;                      // AutoBoxing
        byte by1stack = by1.byteValue();
        System.out.println("Byte AutoBoxing 실습 : " + by1stack);
        byte by2 = by1;                     // UnBoxing
        System.out.println("Byte UnBoxing 실습 : " + by2);
        
        System.out.println("--------------------------------");
        Character ch1 = 'C';                // AutoBoxing
        int ch1cp = ch1.compareTo('J');     // compareTo 메서드는 ch1과 전달인자 'J'의 값을 비교하여 차이 값을 전달한다.
        System.out.println("Character AutoBoxing 실습 : " + ch1cp);
        char ch2 = ch1;                     // UnBoxing
        System.out.println("Character UnBoxing 실습 : " + ch2);
        
        System.out.println("--------------------------------");
        Short sh1 = 25000;                  // AutoBoxing
        int sh1hash = sh1.hashCode();
        System.out.println("Short AutoBoxing 실습 : " + sh1hash);
        short sh2 = sh1;                     // UnBoxing
        System.out.println("Short UnBoxing 실습 : " + sh2);
        
        System.out.println("--------------------------------");
        Long lg1 = 12345678900L;            // AutoBoxing
        String lg1str = lg1.toString();
        System.out.println("Long AutoBoxing 실습 : " + lg1str);
        long lg2 = lg1;                     // UnBoxing
        System.out.println("Long UnBoxing 실습 : " + lg2);
        
        System.out.println("--------------------------------");
        Float ft1 = 123.456f;               // AutoBoxing
        double ft1db = ft1.doubleValue();
        System.out.println("Float AutoBoxing 실습 : " + ft1db);
        float ft2 = ft1;                     // UnBoxing
        System.out.println("Float UnBoxing 실습 : " + ft2);
        
        System.out.println("--------------------------------");
        Double db1 = 123.456;               // AutoBoxing
        float db1ft = db1.floatValue();
        System.out.println("Double AutoBoxing 실습 : " + db1ft);
        double db2 = db1;                     // UnBoxing
        System.out.println("Double UnBoxing 실습 : " + db2);
    }
}

package ex1;

import java.util.Scanner;

public class Ex2_Scanner {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("문자1 : ");
        
        // 키보드의 입력값 입력 후 (개행) 문자열로 반환
        // String str;
        // str = sc.nextLine();
        String str = sc.nextLine();
        System.out.print("숫자 : ");
        // Integer 래퍼 클래스의 내부 함수를 이용하여 입력된 문자열을 int형으로 변환해준다.
        int num = Integer.parseInt(sc.nextLine());  
        System.out.print("문자2 : ");
        String str2 = sc.nextLine();
        System.out.println("출력");
        System.out.println("문자1 : " + str);
        System.out.println("숫자 : " + num);
        System.out.println("문자2 : " + str2);
        
        // 키보드 장치로부터 연결 된 Scanner 객체를 종료
        sc.close();      
    }
}

package ex1;

import java.util.Scanner;

public class Ex3_IntegerWraffer {

    public static void main(String[] args) {
        // user interface => UI
        Scanner sc = new Scanner(System.in);
        System.out.print("반드시 정수를 입력하세요 : ");
        // int형을 클래스로 제공해주는 자바 API
        String numStr = sc.nextLine();

        // NumcerFormatException이 발생될 수 있다.
        // 숫자를 나타내는 문자열 값을 정수 int로 반환해주는 메서드
        try {
            // 예외가 일어 날법한 코드
            int num = Integer.parseInt(numStr);
            System.out.println("입력 값의 2배 : " + (num * 2));
        } catch (Exception e) {
            // 예외가 일어나면 실행
            System.out.println("숫자만 입력하셔야 합니다.");
            System.out.println("error : " + e.getMessage());
        }       
    }
}

package ex2;

import java.util.Scanner;

public class Ex1_Boolean {
private String aa;
    // JVM이 처음 호출하는 메서드
    public static void main(String[] args) {
        String name = scanName();
        int age = scanAge();
        System.out.println("당신의 이름은 : " + name + "입니다.");
        System.out.println("당신의 나이는 : " + age + "세 입니다.");
        Boolean juniorAge = checkAge(age);
        if (juniorAge == true) {
            System.out.println("당신은 미성년자입니다.");
        } else {
            System.out.println("당신은 성인입니다.");
        }
    }
    // 정수로 반환하는 메서드를 작성 해보세요.
    // 추가) 일반자료형, 참조자료형 각각 Wrapper 클래스까지 포함
    // 배운데로 연습을 권장합니다.
    public static int scanAge() {
        Scanner sc = new Scanner(System.in);
        System.out.print("나이를 입력하세요 : ");
        try {
            int age = Integer.parseInt(sc.nextLine());
            return age;
        } catch (Exception e) {
            // 예외가 일어나면 실행
            System.out.println("숫자만 입력하셔야 합니다.");
            System.out.println("error : " + e.getMessage());
        }
        return 0;
    }
    public static String scanName() {
        Scanner sc = new Scanner(System.in);
        System.out.print("이름을 입력하세요 : ");
        String str = sc.nextLine();
        return str;
    }
    public static Boolean checkAge(int age) {
        Boolean bool = (age < 19);
        return bool;
    }
    // static 메서드를 정의한다.
    /*
    <핵심 요약>
    void : 반환 값이 없을 경우, return 문을 표시하지 않음
    반환형 : 일반자료형, 참조자료형, return 문으로 반환형에 맞게 값을 표시
    - 메서드 이름 : 소문자 시작 *****
    // 인자값 : 메서드를 호출할 때 전달 받을 값에 맞도록 선언이 되어 있어야 한다.
    [접근제한자][static][반환형][메서드 이름](자료형 지역변수, 자료형 지역변수2) {
        return 반환값
    }
     */
    public static String addMember(String id, String pwd, int age) {
        StringBuffer sb = new StringBuffer();
        sb.append("아이디 : ").append(id);
        sb.append("비밀번호 : ").append(pwd);
        sb.append("나이 : ").append(age - 1);
        // println() : 인자로 전달된 값을 모두 문자로 변환 해주는 메서드이다.
        System.out.println(sb);
        // StringBuffer 객체이지, String 클래스와 연관이 없는 객체이다
        return sb.toString();
    }
    public static void printLog() {
    }
    // 반환 값이 있는 메서드
    public static String printMsg() {
        return "test";
    }
}

package ex2;

import java.util.Scanner;

public class Ex2_Oper1 {
    // 메서드 역활, 분류
    // 객체 지향 : 재사용성 (다형성, 캡슐화 등등)
    // 자바클래스를 하나
    // 안드로이드, jsp, 스프링(웹어플리케이션), 스윙, Fx.....
    public static void main(String[] args) {
        // 콘솔 UI : 메인 메서드에서 사용하면 된다.
        Scanner sc = new Scanner(System.in);
        System.out.print("숫자를 입력 1 : ");
        int numA = Integer.parseInt(sc.nextLine());
        System.out.print("숫자를 입력 2 : ");
        int numB = Integer.parseInt(sc.nextLine());
        // 비지니스 로직 : 
        int resNum1 = numA + numB;
        int resNum2 = numA * numB;
        int resNum3 = numA - numB;
        int resNum4 = numA / numB;
        int resNum5 = numA % numB;
        System.out.println(resNum1);
        System.out.println("결과 : " + resNum1);
        System.out.println("같다 : " + (numA == numB));
        System.out.println("결과 : " + resNum2);
        System.out.println("다르다 : " + (numA != numB));
        System.out.println("결과 : " + resNum3);
        System.out.println("크다, 크거나 같다 : " + (numA > numB) + " , " + (numA >= numB));
        System.out.println("작다, 작거나 같다 : " + (numA < numB) + " , " + (numA <= numB));
        System.out.println("결과 : " + resNum4);
        System.out.println("결과 : " + resNum5);
        sc.close();
    }
}

package ex2;

import java.util.Scanner;

public class Ex2_Oper2 {
    // 비지니스 기능만 분리해서 메서드를 정의 해봤다.
    public static void myModel(int numA, int numB) {
        // 비지니스 로직 : 
        myPlus(numA, numB);
        myMin(numA, numB);
        myMul(numA, numB);
        myDiv(numA, numB);
        myRest(numA, numB);
        myComp(numA, numB);
    }
     public static void myPlus(int numA, int numB) {
         int resNum = numA + numB;
         System.out.println("더하기 결과 : " + resNum);
     }
     public static void myMin(int numA, int numB) {
         int resNum = numA - numB;
         System.out.println("빼기 결과 : " + resNum);
     }
     public static void myMul(int numA, int numB) {
         int resNum = numA * numB;
         System.out.println("곱하기 결과 : " + resNum);
     }
     public static void myDiv(int numA, int numB) {
        float resNum;
        resNum = ((float)numA / (float)numB);
        System.out.println("나누기 결과 : " + resNum);
     }
     public static void myRest(int numA, int numB) {
         int resNum = numA % numB;
         System.out.println("나머지 결과 : " + resNum);
     }
     public static void myComp(int numA, int numB) {
        System.out.println("같다 : " + (numA == numB));
        System.out.println("다르다 : " + (numA != numB));
        System.out.println("크다, 크거나 같다 : " + (numA > numB) + " , " + (numA >= numB));
        System.out.println("작다, 작거나 같다 : " + (numA < numB) + " , " + (numA <= numB));
     }
    // 메서드를 다양하게 기능별로 정의 한 후에 값을 호출해서 출력
    // 결과가 동일하게 나오도록 구현 해보기
    // 메서드는 고유 영역이며 메서드안에 또 다른 메서드를 포함되면 안된다.
    public static void main(String[] args) {
        // 콘솔 UI : 메인 메서드에서 사용하면 된다.
        Scanner sc = new Scanner(System.in);
        System.out.print("숫자를 입력 1 : ");
        int numA = Integer.parseInt(sc.nextLine());
        System.out.print("숫자를 입력 2 : ");
        int numB = Integer.parseInt(sc.nextLine());
        myModel(numA,numB);
        sc.close();
    }
}