728x90

 

Wrapper class(래퍼 클래스)

기본자료형을 클래스화 시킨 것

기본자료형을 객체화 해주는 클래스

 

기본형 데이터타입을 클래스화하면 Object 클래스의 자식 클래스가 되며,

데이터타입에 상관없이 Object클래스를 이용한 처리가 가능해진다

 

 

Wrapper class 출현 배경

기본 자료형들은 ‘자료형’으로만 사용, 메소드 사용불가. 그래서 래퍼클래스가 나오게됨

 

*기본자료형 8가지

boolean char byte int short long float double

 

Wrapper 래퍼클래스는 참조 자료형

클래스 자체가 자료형으로 사용가능하기에 래퍼클래스도 자료형으로도 사용 가능하고, 그 안에 메소드도 활용가능

 

기본 자료형(primitive)

    - 자료형 사용 o, 메소드 사용x

참조 자료형(non-primitive, reference type)

(Wrapper Class = 참조형)

    - 자료형 사용 o, 메소드 사용 o

 

기본 자료형 Wrapper Class
boolean Boolean
char Character
byte Byte
int Integer
short Short
long Long
float Float
double Double

 

 

boxing vs unBoxing

기본자료형 vs Wrapper클래스

  • boxing : 기본자료형 → wrapper클래스로 변환(객체화)
  • unBoxing : wrapper클래스 → 기본자료형으로 변환
    • 객체에 저장되어 있는 데이터를 기본형 데이터로 꺼내는 작업

 

Wrapper클래스가 박스

안에 메소드,필드 등 담아두기에 박스

반대로 박스(객체)에 저장되어 있는 데이터를 기본형 데이터로 꺼내는 작업이 언박싱

// boxing
int num1 = 10;
Integer integer1 = new Integer(**num1**); // num1 자체를 래퍼클래스로 전환 -> boxing

// unBoxing
int num2 = integer1.**intValue();**       // num2 : 래퍼클래스를 기본자료형 int로 변환 -> unBoxing
// boxing
int i = 10;
Integer iValue1 = new Integer(i); 
Integer iValue2 = new Integer(123);

double d = 1.123;
Double dValue1 = new Double(d); 
Double dValue2 = new Double(5.323);
// unBoxing
Integer iValue = new Integer(4578); 
int i = iValue.intValue();

Double dValue = new Double(44.241); 
double d = dValue.doubleValue();

 

 

autoBoxing, autoUnBoxing

JDK1.5버젼부터 지원

자동으로 박싱,언박싱

기본 타입과 Wrapper클래스 타입 간의 변환이 자동으로 이루어진다

(바로 대입적용이 가능케됨)

// 자동박싱,언박싱. 바로 대입적용이 가능케됨
Integer integer2 = num1; // autoBoxing
int num3 = integer2;     // autoUnBoxing
int i = 10; 
Integer iValue = i; // 바로 대입 가능

Double dValue = new Double(3.14); 
double d = dValue;  // 바로 대입 가능

 

 

 

 


 

 

 

1)String을 기본 자료형으로 바꾸기

parsing(파싱)

기본자료형에서 래퍼클래스로 변환하기 위해 많이 사용하는게 파싱(parsing)

parsing : 문자열을 기본 자료형으로 변환하는 것

변환가능한 같은 형태이여야한다

     ex) 숫자면 숫자끼리. 문자열 "1"을 int 1로 변환 가능

int i = Integer.parseInt("10");
double d = Double.parseDouble("홍길동");
// 에러메시지 : java.lang.NumberFormatException: For input string: "홍길동"
// 파싱할 자료형의 형태를 지니지 않아서 나는 에러

short s = Short.parseShort("10 ");		// 잦은 실수 요인 : 공백 조심
float f = Float.parseFloat(" 10");
boolean b = Boolean.parseBoolean("true");
byte by = Byte.parseByte("10");
Long l = Long.parseLong("10");
// 캐릭터 래퍼클래스에는 파싱기능 존재x -> chatAt()로 대체

byte b = Byte.parseByte("1");
short s = Short.parseShort("2");
int i = Integer.parseInt("3");
long l = Long.parseLong("4");
float f = Float.parseFloat("0.1");
double d = Double.parseDouble("0.2"); 
boolean bool = Boolean.parseBoolean("true");

char c = "abc".charAt(0);

 

 

2)primitive type(기본 자료형)을 String으로 바꾸기

String str1 = i + ""; 					   // 방법1. 가장 쉬운 변환.대중적 사용
String str2 = String.valueOf(s); 		   // 방법2
String str3 = Byte.valueOf(by).toString(); // 방법3
String b = Byte.valueOf((byte)1).toString();
String s = Short.valueOf((short)2).toString();
String i = Integer.valueOf(3).toString();
String l = Long.valueOf(4L).toString();
String f = Float.valueOf(0.1f).toString();
String d = Double.valueOf(0.2).toString();
String bool = Boolean.valueOf(true).toString();
String ch = Character.valueOf('a').toString();

 

728x90
반응형
728x90

 

자바 기본 API(Application Programming Interface)

목차

1.String

2.Wrapper

3.Date

  1. Calendar
  2. Gregorian Calendar

4.Math

 


 

String Class

String : 문자열 클래스

문자열의 값 수정 불가(불변 클래스) 수정 시 수정된 문자열이 새로 할당 되어 새 주소를 넘김

String name = "abc";
name = "def"; // <-수정된 거 아닌가? 수정된거 아님
immutable(불변) 의미
배열 크기 변경 불가능처럼
눈으로 보이기는 수정되는 것처럼 보이나 컴퓨터 안에 로직은 삭제 새로생성되었고 주소값도 변경됨

 

 

API에 구현이 되어있는 메소드들

hashCode(), identityHashCode()

 

hashCode()

hashCode() : int ← 매개변수x 주소값 반환

Returns a hash code for this string.

주소값을 보기 위해 사용하는 코드

객체의 주소값을 해시코드로 구현한 결과값

object클래스에 있음.

실제 주소값을 직접 볼 수 있는건 아님.

자바는 애초에 주소값을 다이렉트로 볼 수 없게 만듬

equals비교했는데 둘이 같다면 해쉬코드 결과도 둘이 같게해줘야한다

System.out.println("str1의 hashcode : "+str1.hashCode());
System.out.println("str2의 hashcode : "+str2.hashCode());
System.out.println("str3의 hashcode : "+str3.hashCode());

 

identityHashCode()

System.identityHashCode(변수명)

실주소값을 연산해놓은 결과값을 도출하는 메소드

스트링은 불변 클래스

수정되는게 아닌 새로 생성하고 기존것 삭제하고 대체되는 개념

 


 

StringBuffer & StringBuilder

문자열 클래스

주소값은 그대로하고 문자열을 수정 가능케 하는 메소드

가변클래스 : 문자열 수정 가능. mutable(가변)

    - String클래스 : 변경이 적고 읽기만 많은 경우에 유리

    - StringBuffer / StringBuilder : 문자열에 대한 수정이 많이 일어나는 경우 유리

https://rise-up.tistory.com/303

 

[Java] 주소값은 그대로하고 문자열을 수정 가능케 하는 메소드 : StringBuffer & StringBuilder

StringBuffer & StringBuilder 클래스는 불변 클래스인 String 클래스랑 다르게 문자열 수정이 가능한 가변 클래스다 String이 수정이 불가능하다니 무슨 말일까? String 타입의 변수에 값을 넣어보면 언제든

rise-up.tistory.com

 

 

StringBuffer vs StringBuilder 비교

불변 클래스인 String 클래스랑 다르게 문자열 수정이 가능한 가변(mutable)클래스

문자열 값 수정 가능, mutable(가변) 수정, 삭제 등이 기존 문자열에 수정되어 적용 기본 16문자 크기로 지정된 버퍼를 이용하며 크기 증가 가능

모두 같은 기능이나 동기화처리 가능 / 불가능으로 구별된다

동기화가 들어가면 안전 : 데이터에 대해 락을 걸어놓고 진행. 처리속도가 느림. 동기화가 안들어가면 속도가 빠름

  • StringBuffer   동기화 o / 느림 / 안전 / thread safe기능o
  • StringBuilder 동기화 x / 빠름 / 안전 x / thread safe기능x

 

메모리 관리를 위해 String대신 쓰기도 하나 String을 대개 많이씀

컴퓨터도 많이 좋아지고 버퍼나빌더를 쓴다고 눈에띄게 빨라지는건 아님

StringBuffer/StringBuilder는 자동으로 수용량 증가

 

 

쓰레드 세이프 기능(thread safe)

멀티 쓰레드 프로그래밍에서 여러 쓰레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없는 것을 의미

이를 위해 한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에 의해 방해받지 않도록 "임계 영역(critical section)"과 "잠금(lock)"의 개념이 도입됨

 

  • 임계영역(critical section)

둘 이상의 스레드가 동시에 접근해서는 안 되는 공유 리소스(자료 구조 또는 장치)를 접근하는 코드의 일부를 뜻함

  • 락(lock)

모든 객체에는 락(lock)이 하나씩 있고 이 락(lock)을 가지고 있는 스레드만 해당 객체의 임계 영역 코드와 관련된 작업이 가능

  1. 공유 데이터를 사용하는 코드 영역을 임계 영역으로 지정하고, 공유 데이터가 가지고 있는 lock을 획득한 단 하나의 쓰레드만 영역 내의 코드를 수행할 수 있게함
  2. 해당 쓰레드가 임계 영역 내의 모든 코드를 수행하고 벗어나 lock을 반납해야만 다른 쓰레드가 반납된 lock을 획득하여 임계 영역 내의 코드를 수행할 수 있도록함

 

 

쓰레드(thread)의 동기화(Synchronization)

여러 스레드가 한 리소스를 사용하려 할 때

사용하려는 스레드 하나를 제외한 나머지 스레드들은 리소스를 사용하지 못하도록 막는 것

 

쓰레드 동기화는 크게 Synchronized, Volatile, Atomic 3가지가 있고 추후 깊게 공부해보자

 

728x90
반응형
728x90

String 클래스

 

String Class의 메소드들

1)charAt ()

charAt(int index):char

 

2) concat()

concat(String str):String
원래 문자열 끝에 매개변수로 들어온 값을 이어붙인 문자열 반환

 

3) equals()

equals(Object anObject):boolean

 

4)substring()

substring(int beginIndex):String
해당 인덱스 넘버부터 문자열 시작
substring(int beginIndex, int endIndex):String

 

5)replace()

replace(char oldChar, char newChar):String

 

 

public class practice_everyday01 {
	public static void main(String[] args) {	
		
		// String class : representative methods
		String str = "힘을 내라";
		
		// 1)charAt ()
		// charAt(int index):char
		char cheer = str.charAt(0);
		System.out.println("1."+cheer); // 힘
		
		// 2) concat()
		// concat(String str):String
		// 원래 문자열 끝에 매개변수로 들어온 값을 이어붙인 문자열 반환
		String cstr = str.concat(" cheer up");
		System.out.println("2."+cstr );
		
		
		// 3) equals()
		// equals(Object anObject):boolean
		System.out.println("3."+str.equals("equal"));
		
		// 4)substring()
		// substring(int beginIndex):String
		// 해당 인덱스 넘버부터 문자열 시작
		// substring(int beginIndex, int endIndex):String
		// A to B 사이의 문자열 일부 반환
		
		System.out.println("4.1."+str.substring(0,3));
		System.out.println("4.2."+str.substring(2));
		
		
		// 5)replace()
		// replace(char oldChar, char newChar):String
		
		System.out.println("5."+str.replace('힘','손'));
	}	
}

 

 

728x90
반응형
728x90

 

StringBuffer & StringBuilder 클래스는

불변 클래스인 String 클래스랑 다르게 문자열 수정이 가능한 가변 클래스다

 

String이 수정이 불가능하다니 무슨 말일까?

String 타입의 변수에 값을 넣어보면 언제든 바꿀 수 있는걸 알 것이다. 근데 사실 이게 데이터 자체가 수정되는게 아니라 시스템 내부에서는 String 타입의 변수에 값이 들어오면 메모리에 새로운 공간과 주소값을 생성시키고 기존의 것을 삭제하고 대체하는 식으로 작동한다. 그럼 주소값도 달라지고 눈에 보이는건 수정된 걸로 보이지만 말이다. 근데 이 둘 StringBuffer & StringBuilder은 말그대로 데이터 자체를 수정시킨다. 주소값 변함없이.

 

String 클래스와 이 둘의 차이

 - String : 변경이 적고 읽기만 많은 경우에 유리. 수정불가.

 - StringBuffer & StringBuilder : 문자열에 대한 수정이 많이 일어나는 경우 유리. 수정가능.

 

StringBuffer & StringBuilder의 차이는?

StringBuffer 동기화 o / 상대적으로느림 / 안전

StringBuilder 동기화 x / 빠름

둘이 동기화처리 빼고는 기능이 모두같다

동기화가 들어가면 상대적으로 안전하다. 데이터에 대해 락을 걸어놓고 진행하기에 처리속도가 상대적으로 느릴 수 있고 동기화가 안들어가면 락이 없어 그마만큼 속도가 다소 빠르다.

 

StringBuffer & StringBuilder

메모리 관리를 위해 에전에는 String대신 쓰기도 했다고 하나 요새는 성능들도 많이 좋아지고 String을 대개 많이쓴다고한다. 퍼나빌더를 쓴다고 눈에띄게 빨라지는게 아니라고 한다. 또한 자동으로 수용량(capacity)가 증가한다.

 

 

StringBuffer 안에 쓸 수 있는 많이 쓰는 메소드들

1) append()

받아온 값을 뒤에 추가로 이어주는 메소드

 

2) insert()

원하는 자리에 값 추가 시킬 수 있는 메소드

 

3) delete()

데이터 삭제하는 메소드

delete(int start, int end) : StringBuffer

deleteCharAt(int index) : StringBuffer

 

4)reverse()

앞뒤 거꾸로 값을 바꿔놓는 메소드

 

728x90
반응형
728x90

8.문자와 문자열

 

하나의 문자는 홑따옴표로 감싸줘야함. 캐릭터 타입의 변수에 저장할 있음

  • 홑따옴표 안에 두개 이상의 문자를 넣을 경우 에러

 

char ch = 'A';

char ch = 'AB';  // error

 

 

String s = "ABC";

  • 문자가 연속적으로 이어져 있는 것을, 문자열 or 문자열 리터럴이라고 부름
  • 문자열을 저장하려면 변수타입이 String이어야함
  • String 원래 자바에서 제공하는 class. 문자열을 다룰 사용
  • 문자열 class 워낙 자주 쓰이기에,  얘만 기본형 변수에 값을 저장하는 것과 같은 표현을 허용함

 

 

 

※ 문자열 출력별 차이

String s1 = "AB";

String s2 = new String("AB");

  • 위의 문장의 거의 같고 보통 위에 문장 사용
  • 차이는 9장에서

String s = "A";  // 문자 하나. ok

String s = "";   // 문자열. ok

char ch = '';    // 문자열. error

 

String s1 = "A" + "B"  // 결과값 "AB" : 문자열 하나로 결합하라는

  • "" + 7 "" + "7"   "7" : (숫자를 문자열로 캐스팅한 )
  • 문자열은 문자열하고만 결합이 가능해서 숫자7 문자열로 바꾸고 결합한
  • 숫자에 문자열을 결합하면 문자열 숫자가 되는
  • 연산 진행 순서는

ex) ""+7+7 "7"+7 "7"+"7" "77"

ex) 7+7+"" 14+"" "14"+"" "14"

 

문자열 + any type 문자열

any type + 문자열 문자열

 

728x90
반응형

+ Recent posts