10. JAVA static블락 / wrapper클래스 : 네이버 블로그

2020. 6. 8. 13:47·개발/JAVA
728x90
반응형
 

1. static block

- static block 혹은 static Initializer라고도 한다

- main 보다 먼저 수행된다

- static 변수의 초기화에 사용

- static { }

class 클래스명 {
	static int num; // static변수
	String name; 

	static { //static 블락
	// 이 블락안에는 static멤버로 선언된 멤버에만 접근 가능
		num = 10; // [o]
		// name = "홍길동"; // [x]

		staticPrint(); // [o]
        // nonStaticPrint(); // [x]
			
		int sum = num * 100;
		System.out.println("num은 " + num + ", sum = " + sum);
	}
		
	public void nonStaticPrint(){
		System.out.println("인스턴스 메서드");
	}
	public static void staticPrint(){
		System.out.println("정적 메서드");
	}
	public static void main(String args[]){
		//객체 생성 안하고 있음
	}
}

 

2. wrapper class

- '포장하다' 라는 의미의 wrapper 클래스는 기본형의 값을 참조형으로 사용해야 하는 경우 사용되는 클래스다

- 1.4 버전 이전에서는 엄격하게 구분되었으나 5.0 이상 버전에서는 오토박싱(auto-boxing) 및 오토언박싱(auto-unboxing)지원으로 쉽게 변환 가능하다

--------------------------------------------------------------
   기본자료형(Primitive Type)	|    참조형(Reference Type)
--------------------------------------------------------------
	      byte              |            Byte
	      short             |            Short
	      int               |            Integer
	      long              |            Long
	      float             |            Float
	      double            |            Double
	      char              |            Character
	      boolean           |            Boolean
--------------------------------------------------------------

- 기본자료형 -> 참조형 (오토박싱), 참조형 -> 기본자료형 (오토언박싱)

// 1.4 이전버전의 코딩방식
int a=10;
int b=20;
Integer aObj = new Integer(a);
Integer bObj = new Integer(b);

// int sum = aObj + bObj; // 1.4 이전버전에서는 에러
int sum = aObj.intValue() + bObj.intValue(); // 1.4이전 코딩 방식
System.out.println(sum);
System.out.println(bObj.toString());

// 5.0이상 코딩 방식(오토박싱 및 언박싱 지원)
Integer cObj = a; // auto-boxing
System.out.println(cObj);
int d = cObj; // unboxing
System.out.println(d);

package wrapperclass10;

/*[AutoBoxing <-> AutoUnBoxing]
 * -오토박싱:기본자료형이 참조형(wrapper클래스)으로 자동으로 바뀌는것, 예)int -> Integer
 * -오토언박싱:참조형(wrapper클래스)이 기본자료형으로 자동으로 바뀌는것, 예)Integer -> int
 */
public class WrapperClass01 {

	public static void main(String[] args) {
		// JDK 1.4이전 버전에서의 코딩 형태
		// 기본 자료형으로 +연산]
		int num1 = 200;
		int num2 = 20;
		int result = num1 + num2;
		System.out.println(result);
		// Wrapper 클래스로 +연산]
		Integer num1Obj = new Integer(10);
		Integer num2Obj = new Integer(20);
		// Integer resultObj = num1Obj + num2Obj;[x] 1.4이전 버전에서는 빨간줄
		// num1Obj에는 주소값이 저장되어 있기 때문
		result = num1Obj.intValue() + num2Obj.intValue(); // 1.4 이전 버전에서는 이렇게 연산
		// num1.[x] 기본자료형은 멤버가 없다
		// num1을 Integer 타입으로 변경해서 Integer 클래스의 메소드 호출
		Integer num1Object = new Integer(num1);// [o] JDK 1.4 이전 버전에서
		System.out.println("num1(int)를 byte형 값으로 변경 : " + num1Object.byteValue());
		System.out.println("num1을 이진수로 변경:" + Integer.toBinaryString(num1));// to는 바꾸다
		System.out.println("num1Obj:" + num1Obj);// 오버라이딩 되서 10이 나옴. 주소 안나옴
		System.out.println("num1Obj:" + num1Obj.toString());// 오버라이딩 되서 10이 나옴. 주소 안나옴

		// JDK 5.0이후 버전에서의 코딩 형태
		// 오토박싱
		num1Obj = num1;// JDK 1.4이전 버전에서는 에러남
		num2Obj = 20;// JDK 1.4이전 버전에서는 에러남
		// 오토언박싱
		int num3 = num1Obj;// JDK 1.4이전 버전에서는 에러남
		Integer num3Obj = 300;// 오토박싱(int형 상수(300)->Integer)
		// Wrapper클래스를 사용하는 이점: Wrapper 클래스 안의 많은 메소드 사용가능
		// 고로 쉽게 정수를 이진수로 혹은 8진수로 쉽게 변환가능
		System.out.println("int형 최대값: " + Integer.MAX_VALUE);
		System.out.println("int형 최소값: " + Integer.MIN_VALUE);
		System.out.println("num1을 이진수 문자열로 변경: " + Integer.toBinaryString(num1));
		System.out.println("num1을 8진수 문자열로 변경: " + Integer.toOctalString(num1));
		System.out.println("num1을 16진수 문자열로 변경: " + Integer.toHexString(num1));
		System.out.println(num1Obj.getClass().getName());// 어떤게 어떤 클래스의 어떤 메소드를 쓰는지 알고싶을때

		/*
		 * 자바의 모든 클래스들은 Object라는 최상위 클래스로부터 상속을 받는다. Wrapper클래스들은 Object로부터 상속받은
		 * toString()메소드를 오버라이딩하여 인스턴스 변수 출력시 주소가 아니라 실제 저장된 값이 반환되도록 오버라이딩 되었다.
		 */
		Integer remodel = new Integer(99);
		System.out.println("remodel=" + remodel);// toString() 생략
		System.out.println("remodel=" + remodel.toString());
		System.out.println("remodel=" + remodel.hashCode());

		/*
		 * 원래 Object클래스의 toString() 메소드는 메모리 주소를 아래와 같은 문자열로 반환하도록 정의됨.
		 * 패키지명1.패키지명2....클래스명@16진수 체계의 메모리 주소
		 */
		WrapperClass01 wc = new WrapperClass01();
		System.out.println("wc= " + wc);
		System.out.println("wc.toString()= " + wc.toString());
		System.out.println("wc.hashCode():10진수-" + wc.hashCode());
		System.out.println("wc.hashCode():16진수-" + Integer.toHexString(wc.hashCode()));

	}// main

}// class

package wrapperclass10;

import java.util.Scanner;
import java.util.regex.Pattern;

public class WrapperClass02 {

	public static void main(String[] args) {
		// [Integer Wrapper클래스의 주요 메소드]
		// 1] 숫자형식의 문자열을 숫자로 변경,
		// static int parseInt(String s);
		// static Integer valueOf(String s);
		String strNumber = "1000";
		System.out.println("10+strNumber= " + (10 + strNumber));
		System.out.println("strNumber를 숫자로 변경 첫번째] " + (10 + Integer.parseInt(strNumber)));
		System.out.println("strNumber를 숫자로 변경 두번째] " + (10 + Integer.valueOf(strNumber)));// 메소드 체인

		// Scanner sc = new Scanner(System.in);
		// System.out.println("나이를 입력하세요.");
		// String ageString = sc.nextLine();
		// System.out.println("당신의 10년후 나이: "+(10+Integer.parseInt(ageString)));

		System.out.println("문자열 1000을 byte형 값으로 변경] " + Integer.valueOf(strNumber).byteValue());
		// int(매개변수 타입) -> Integer타입 전달:오토언박싱ㄱ
		System.out.println("문자열 1000을 16진수형태의 문자열로 변경] " + Integer.toHexString(Integer.valueOf(strNumber)));
		// int Integer.parseInt("숫자형식의 문자열")
		// int형은 기본 데이터형이므로 멤버가 없다.
		int num1 = Integer.parseInt(strNumber);
		Integer numObj = num1;// 오토박싱
		System.out.println("숫자 1000(num1)을 short형 값으로 변경] " + numObj.shortValue());

		String money = "1억원";
		// Integer.parseInt(money);[x] 실행시 NumberFormatException 오류, 숫자와야됨
		String FloatString = "3.14";
		// Integer.parseInt(FloatString);[x] 실행시 NumberFormatException 오류, 숫자와야됨
		// 실수형태(소수점이 포함된)의 문자열을 실수로 변경시: Float이나 Double 타입의 parse를 써야함
		System.out.println(Float.parseFloat(FloatString));
		System.out.println(Double.parseDouble(FloatString));

		// 2] 2진수나 8진수나 16진수형식의 문자열을 십진수로 바꿀때 사용하는 메소드
		// static int parseInt(String s, int radix)
		// static int valueOf(String s, int radix)
		System.out.println("이진수 형태의 문자열 1000을 10진수로] " + Integer.parseInt(strNumber, 2));
		System.out.println("이진수 형태의 문자열 1000을 8진수로] " + Integer.parseInt(strNumber, 8));
		System.out.println("이진수 형태의 문자열 1000을 16진수로] " + Integer.parseInt(strNumber, 16));

		// 3] 숫자를 문자열로 변경
		// static String toString(int i)
		// static toString()
		int num2 = 1000;
		// 3-1]정적 메소드 사용
		System.out.println(Integer.toString(num2) + 10);
		// 3-2]인스턴스형 메소드 사용
		Integer intObject = num2;// 오토박싱
		System.out.println(intObject.toString() + 10);

		// 4]십진수를 각 진수로 변환
		// static String toBinaryString(int i) : 2진수
		// static String toOctalString(int i) : 8진수
		// static String toHexString(int i) : 16진수
		System.out.println(Integer.toHexString(15));

		Integer object = 77;// 오토박싱
		System.out.println("object] " + object);
		System.out.println("object.toString()] " + object.toString());
		System.out.println("object.hashCode()] " + object.hashCode());

		Scanner sc = new Scanner(System.in);
		System.out.println("몸무게를 소수점 둘째 자리까지 입력하세요");
		String weightString = sc.nextLine();
		// 1] 입력받은 몸무게에 10KG을 더해서 출력
		// 방법1]
		float weight = Float.parseFloat(weightString) + 10;
		System.out.println("현재몸무게 10KG 추가시] " + weight);

		// 2] 몸무게를 문자열로 변환해서 문자열의 길이 구하기
		System.out.println(Float.toString(weight).length());

	}// main

}// class

package wrapperclass10;

import java.util.Scanner;

public class WrapperClass03 {
	// 문] 인자로 전달받은 value가 숫자형식이면 true 반환 아니면 false 반환하는 메소드를 만들어라
	// 예] "20" -> true, "20A1" -> false
	public static boolean isNumber(String value) {
		// Character 클래스의 메소드 사용
		/*for (int i = 0; i < value.length(); i++) {
			// 방법1]
			// if(!Character.isDigit(Character.codePointAt(value, 2))) return false;
			// 방법2]codePointAt();만 사용
			if (!(Character.codePointAt(value, i) >= '0' && Character.codePointAt(value, i) <= '9'))
				return false;
		}*/
		// String 클래스의 메소드 사용
		for (int i = 0; i < value.length(); i++) {
			if(!(value.codePointAt(i)>='0' && value.codePointAt(i)<='9'))
				return false;
			
		}
		return true;
	}// isNumber

public static void main(String[] args) {
		// JDK 1.4이전 버전에서의 코딩 형태
		char ch = 'A';
		Character chObj = new Character(ch);
		char chResult = (char) (chObj.charValue() + 1);
		System.out.println("chResult] " + chResult);
		// JDK 5.0이후 버전에서의 코딩 형태
		// 인스턴스 변수에 직접 데이터 대입 가능]
		chObj = 'C'; // 오토박싱 char -> Character 형으로
		chResult = chObj; // 오토언박싱 Character -> char 형으로
		System.out.println("chObj] " + chObj);

		// [Character 클래스의 주요 메소드]

		// 1] static int codePointAt (CharSequence seq, int index)
		// : 문자열에서 index에 해당하는 위치의 한 문자의 아스키 코드값을 반환한다. (index 는 0부터 시작)
		System.out.println(Character.codePointAt("ABCD", 2));

		// 2] static boolean isDigit(char ch)
		// static boolean isDigit(int codePoint)
		// : 어느 한 문자가 숫자인지 아닌지 판단하는 메소드
		System.out.println(Character.isDigit('A') ? "숫자다" : "숫자가 아니다");
		System.out.println(Character.isDigit('2') ? "숫자다" : "숫자가 아니다");
		System.out.println(Character.isDigit(65) ? "숫자다" : "숫자가 아니다");
		System.out.println(Character.isDigit('가') ? "숫자다" : "숫자가 아니다");
		System.out.println(Character.isDigit(44032) ? "숫자다" : "숫자가 아니다");

		/*
		 * Scanner sc = new Scanner(System.in); System.out.println("나이를 입력하세요"); String
		 * value = sc.nextLine(); if (isNumber(value))
		 * System.out.println("당신의 10년 후 나이는 " + (Integer.parseInt(value) + 10)); else
		 * System.out.println("숫자만 입력해주세요");
		 */

		// 3] static boolean isLetter(char ch)
		// : 문자인지 아닌지(언어(한글,한문,영어,일본어 등)에 해당하는 것만)판단하는 메소드
		System.out.println("[isLetter 메소드]");
		System.out.println(Character.isLetter('가'));// true
		System.out.println(Character.isLetter('A'));// true
		System.out.println(Character.isLetter('a'));// true
		System.out.println(Character.isLetter('家'));// true
		System.out.println(Character.isLetter('9'));// false
		System.out.println(Character.isLetter('@'));// false

		// 4] static boolean isWhitespace(char ch)
		// static boolean isWhitespace(int codePoint)
		// : 공백인지 아닌지 판단하는 메소드
		System.out.println("[isWhitespace 메소드]");
		System.out.println(Character.isWhitespace('가'));// false
		System.out.println((int) ' ');// true
		System.out.println(Character.isWhitespace(32));// 공백의 아스키 코드값
		System.out.println(Character.isWhitespace(' '));// true
		String whiteString = "      H    E      L   L  O";
		int whiteCount = 0;
		for (int i = 0; i < whiteString.length(); i++) {
			if (Character.isWhitespace(Character.codePointAt(whiteString, i)))
				whiteCount++;
		} // for
		System.out.println("총 공백수] " + whiteCount);

		// 5] static boolean isLowerCase(char ch)
		// static boolean isUpperCase(char ch)
		// : 대소문자를 판단하는 메소드(영문자에만 적용) / 알파벳이 아닌 문자에 적용시 모두 false 반환
		System.out.println("[isLowerCase/isUpperCase 메소드");
		System.out.println(Character.isUpperCase('A'));// true
		System.out.println(Character.isUpperCase('a'));// false
		System.out.println(Character.isLowerCase('A'));// false
		System.out.println(Character.isLowerCase('a'));// true
		System.out.println(Character.isUpperCase('가'));// false
		System.out.println(Character.isLowerCase('9'));// false

		// 문] 아이디를 입력받는데 영문자 소문자와 숫자로만 입력받아야 한다.
		// 대문자가 포함되어 있으면 '잘못 입력했습니다'라고 출력하고 제대로된 아이디를 입력 받을때까지 계속 입력 받도록 하여라
		// 단, 숫자로 시작해서도 안된다. 숫자로 시작한 아이디를 입력했을때도 '잘못 입력했습니다'라고 출력하세요

		System.out.println("[String 클래스의 toCharArray() 메소드]");
		String value = "KOSMO";
		char[] chArray = value.toCharArray();
		System.out.println(chArray[0]);// K
		System.out.println(chArray[1]);// O
		System.out.println(chArray[2]);// S
		// Scanner sc = new Scanner(System.in);
		// 다시 확인
		/*
		 * while (true) { System.out.println("아이디를 입력해 주세요"); boolean isCorrect = true;
		 * String nickname = sc.nextLine(); char[] chnick = nickname.toCharArray(); for
		 * (int i = 0; i < chnick.length; i++) {// chnick.length = nickname.length() if
		 * (Character.isDigit(chnick[0]) || !Character.isLowerCase(chnick[i]) &&
		 * !Character.isDigit(chnick[i])) System.out.println("잘못 입력했습니다"); isCorrect =
		 * false; break; }// for if(isCorrect) {
		 * System.out.println("당신의 아이디는] "+nickname); break; }// if }// while
		 */
         // 6] static char isUpperCase(char ch)
		// static char isLowerCase(char ch)
		// static int isLowerCase(int code)
		// : 대문자를 소문자로, 소문자를 대문자로
		System.out.println("[toUpperCase/toLowerCase 메소드]");
		System.out.println(Character.toUpperCase('A'));
		System.out.println(Character.toUpperCase('a'));
		System.out.println(Character.toLowerCase('A'));
		System.out.println(Character.toLowerCase('a'));
		System.out.println(Character.toUpperCase('가'));
		System.out.println(Character.toLowerCase('가'));
		System.out.println(Character.toUpperCase('9'));
		System.out.println((char) Character.toUpperCase(97));

		// 문] 사용자로부터 문자열(영문자)을 입력받아서 대문자는 소문자로, 소문자는 대문자로 변경하여 출력
		// 예] Hello -> hELLO
		Scanner sc = new Scanner(System.in);
		System.out.println("영문자를 입력하세요");
		String alphabet = sc.nextLine();
		char[] charr = alphabet.toCharArray();
		for (int i = 0; i < charr.length; i++) {
			if (Character.isLowerCase(charr[i])) {
				// 방법1] 직접출력
				// System.out.println(Character.toUpperCase(charr[i]));
				// 방법2] 대문자로 변경해서 i방에 다시저장
				// charr[i] = Character.toUpperCase(charr[i]);
				// 방법3] 문자들을 하나씩 String형 변수에 누적
				alphabet += Character.toUpperCase(charr[i]);
			} // if
			else
				// 방법1] 직접출력
				// System.out.println(Character.toLowerCase(charr[i]));
				// 방법2] 소문자로 변경해서 i방에 다시 저장
				// charr[i] = Character.toLowerCase(charr[i]);
				// 방법3] 문자들을 하나씩 String형 변수에 누적
				alphabet += Character.toLowerCase(charr[i]);
		} // for
			// 방법3]
		System.out.println(alphabet);

		// 문] 위의 최종 변환된 문자열을 거꾸로 출력하여라
		charr = alphabet.toCharArray();
		System.out.println("[거꾸로 출력]");
		for (int i = charr.length - 1; i >= 0; i--)
			System.out.println(charr[i]);
		System.out.println();

		// 모든 Wrapper 클래스는 기본 자료형을 String형으로 변환해줄 수 있는 아래와 같은 메소드를 공통으로 갖고 있음
		// String toString()
		// static String toString(기본 자료형 타입)
		int num = 100;
		// 정적 메소드 사용]
		System.out.println(Integer.toString(num));// 100 -> "100"(문자열)
		System.out.println("변환된 타입] " + Integer.toString(num).getClass().getName());
		// 인스턴스 메소드 사용]
		Integer intObj = num;// 오토박싱
		System.out.println(intObj.toString());// 100 -> "100"(문자열)
		System.out.println("변환된 타입] " + intObj.toString().getClass().getName());

		short s = 200;
		System.out.println(Short.toString(s) + 200);
		Short shtObj = s;
		System.out.println(shtObj.toString() + 200);

		ch = '가';
		System.out.println("정적 메소드] " + Character.toString(ch));// '가' -> "가"
		System.out.println("인스턴스형 메소드] " + Character.valueOf(ch));

		boolean b = true;
		System.out.println("정적 메소드] " + Boolean.toString(b));// true -> "true"
		System.out.println("인스턴스형 메소드] " + Boolean.valueOf(b));

		// 모든 Wrapper클래스에는 valueOf()계열 메소드를 가지고 있다
		// static Wrapper 클래스 valueOf(기본형): 기본형을 참조형으로 (오토박싱 지원으로 의미없음)
		// static Wrapper 클래스 valueOf(String): 숫자형식의 문자열을 Wrapper클래스로 (단, 래퍼클래스.parse계열
		// 많이 사용)

		String stringNumber = "100";// 문자열 "100"을 숫자 100으로 변경
		byte by = Byte.parseByte(stringNumber);// "100" -> 100
		System.out.println(by + 100);// 200
		System.out.println(Short.parseShort(stringNumber) + 100);// 200
		System.out.println(Integer.parseInt(stringNumber) + 100);// 200
		System.out.println(Integer.valueOf(stringNumber) + 100);// 200

		// 문자열 "TrUe"를 논리값 true로
		String boolString = "TrUe";
		System.out.println(Boolean.parseBoolean(boolString));// "TrUe" -> true
		System.out.println(Boolean.parseBoolean(boolString) && false);// "TrUe" -> false
		System.out.println(Boolean.valueOf(boolString) && false);// "TrUe" -> false

	}// main

}// class

 

728x90
반응형
저작자표시

'개발 > JAVA' 카테고리의 다른 글

12. JAVA ect 클래스 (Math / Date / Calendar / SimpleDateFormat)  (0) 2020.06.08
11. JAVA String Basic / String Method / StringBuffer  (0) 2020.06.08
09. JAVA 클래스 / 객체 생성 및 사용 / 접근지정자 / 전역, 지역 변수 / static : 네이버 블로그  (0) 2020.06.08
08. JAVA 제어문 - 조건문(IF, SWITCH) / 반복문(FOR, WHILE) / 중첩  (0) 2020.06.08
07. JAVA의 연산자 (Operator)  (0) 2020.06.08
'개발/JAVA' 카테고리의 다른 글
  • 12. JAVA ect 클래스 (Math / Date / Calendar / SimpleDateFormat)
  • 11. JAVA String Basic / String Method / StringBuffer
  • 09. JAVA 클래스 / 객체 생성 및 사용 / 접근지정자 / 전역, 지역 변수 / static : 네이버 블로그
  • 08. JAVA 제어문 - 조건문(IF, SWITCH) / 반복문(FOR, WHILE) / 중첩
joolog
joolog
  • joolog
    JOO
    joolog
  • 전체
    오늘
    어제
    • 분류 전체보기 (163)
      • 개발 (81)
        • JAVA (29)
        • PYTHON (9)
        • AWS (15)
        • DOCKER (2)
        • PERCONA (2)
        • ORACLE (12)
        • MYSQL (1)
        • 알고리즘 (0)
        • 기타 (11)
      • 툴 (5)
        • MARKDOWN (1)
        • GIT (1)
        • DOCKER (1)
        • PyCharm (2)
        • IntelliJ (0)
      • 일상 (35)
        • 맛집 (6)
        • 카페 (2)
        • 요리 (4)
        • 글씨 연습 (2)
        • 그저 일상 (7)
        • 내돈 내산 (11)
        • 홍보 (1)
      • 국내 여행 (1)
      • 해외 여행 (15)
        • 체코-오스트리아 (10)
        • 일본 (5)
      • 암 일지 (26)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리
    • 티스토리 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    글씨연습
    자바
    체코
    저요오드식
    오스트리아
    동위원소
    오라클
    티스토리챌린지
    갑상선 암
    자바JDBC
    히로시마
    Oracle
    mysql
    오블완
    요양병원
    재발
    오닉스 리프3
    jdbc
    성모샘쉼터
    잘츠부르크
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
joolog
10. JAVA static블락 / wrapper클래스 : 네이버 블로그
상단으로

티스토리툴바