[Java]자료형과 연산자 한방에 정리하기

Euiyeon Park·2024년 8월 31일

Java

목록 보기
3/16
post-thumbnail

해당 포스트는 Yalco님의 강의를 바탕으로 작성했습니다.

🫧 1. 정수 자료형

자료형크기표현 범위참고
byte1바이트(8비트)-128 ~ 1272⁸ (2의 8승)개의 데이터 표현
short2바이트(16비트)-32,768 ~ 32,7672¹⁶ (2의16승)개의 데이터 표현
int4바이트(32비트)-2,147,483,648 ~ 2,147,483,6472³² (2의32승)개의 데이터 표현
long8바이트(64비트)-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,8072⁶⁴ (2의64승)개의 데이터 표현

📍정수 자료형 주의사항

  • 자료형의 범주를 벗어나는 수는 담을 수 없다.
  • 큰 자료형에 작은 자료형의 값을 넣을 수 있다.
    • 묵시적(암시적 형변환)
    • 값은 동일하지만 자료형이 바뀜
    • 예를 들어, byte였던 1이 short의 변수 값으로 들어가면 동일한 1의 값을 갖지만
      short 자료형의 1로 바뀐다.
  • 작은 자료형에 큰 자료형의 값을 그냥 넣을 수 없다.
    • 값의 크기와 무관하다.
    • 명시적 형 변환이 필요하다(casting)

📍 long형 주의사항

Java에서 정수 리터럴은 int타입으로 간주되기 때문에, long타입을 명시적으로 나타내지 않으면
컴파일러는 int로 인식하여 범위를 초과하는 값에 대해 오류를 발생시킨다.

🪄 정수 리터를 끝에 L을 붙여 long형을 명시한다.

long _8b_longNum1 = 123456789123456789; // error
long _8b_longNum2 = 123_456_789_123_456_789L;

또한 정수 표현의 가독성을 위해 Java7부터 _사용이 가능하다.

long _8b_longNum = 123456789123456789L; 

📍 형 변환(Casting)

변수나 값을 다른 데이터 타입으로 변환하는 과정으로,
묵시적 형 변환명시적 형 변환이 있다.

  • 묵시적 형 변환 : 작은 데이터 타입에서 큰 데이터 타입으로 변환할 때 자동으로 이루어진다.

  • 명시적 형 변환 : 큰 데이터 타입에서 작은 데이터 타입으로 변환할 때 직접 형 변환을 명시해야 한다.

    • 명시적 형 변환은 데이터 손실 가능성이 있으므로 주의해야 한다.
    byte byteNum;
    int intNum = 12345;
    
    byteNum = (byte)intNum; // error, 12345는 byte형 범위를 벗어난다.

    위의 경우 byteNum에는 12345의 32비트 이진수 표현에서 하위 8비트만 취한 값의 10진수인 57이 할당된다.


연산자

연산자에는 우선순위가 존재한다.

우선순위 확인하기

🫧 이항 연산자

이항 연산자좌우 두 값을 계산한 뒤 결과를 반환(return)한다.

연산자연산 의미
+더하기
-빼기
*곱하기
/나누기
%나머지
  • 이항 연산자는 부수효과를 일으키지 않는다.
  • 숫자 데이터(리터럴)과 변수 혼합 사용이 가능하다.
  • 다중으로 사용 가능하나 연산자별 우선순위가 있다. - 괄호로 해결 가능
  • %연산자는 홀수/짝수 구분에 널리 사용된다.

📍 이항 연산자 주의사항

  • 명시적 형 변환 시, 괄호 안에 연산 결과를 넣어줘야 한다.
    • (short) intNum1 + intNum2의 경우, intNum1short형으로 형 변환
    • short + int의 연산이므로 error발생
int intNum1 = 10;
int intNum2 = 20;

short result = (short) intNum1 + intNum2; // error
short result = (short)(intNum1 + intNum2);
  • byteshort간의 연산은 모두 int를 반환한다.
    • bytebyte의 연산 결과 int
    • shortshort의 연산 결과 int
    • byteshort의 연산 결과 int
  • 정수 자료형의 계산은 소수점을 버린다.
    • int result = 5/2의 연산 결과는 2

🫧 복합 대입 연산자

복합 대입 연산자부수효과를 발생시킨다.
부수 효과연산을 수행하면서 변수의 값을 변경하는 것을 의미한다.
복합 대입 연산자는 산술 연산과 대입 연산을 동시에 수행하므로, 변수의 상태를 변화시키는 결과를 낳는다.

연산자연산 의미
a += ba = a + b
a -= ba = a - b
a *= ba = a * b
a /= ba = a / b
a %= ba = a % b

📍 복합 대입 연산자 주의사항

  • 자료형의 범위 경계값에서 복합 대입 연사자 사용을 주의해야 한다.
    • 컴파일러가 초기화 단계까지는 오류를 잡지만 그 이후의 연산은 컴파일러가 막을 수 없다.
byte x = 127 // byte의 최대값
x += 1 		 // 128이 아닌 byte의 최솟값 -128이 할당된다.

🫧 단항 연산자

연산자반환값부수효과
+값 그대로없음
-양음 반전없음
x ++값 그대로1증가
++ x1증가한 값1증가
x --값 그대로1감소
-- x1감소한 값1감소

📍 단항 연산자의 전위(Prefix)/후위(Postfix) 연산자

  1. 전위 연산자
  • 형식 : ++x, --x
  • 동작 : 변수의 값을 먼저 증가 또는 감소 시킨 다음, 그 값을 사용한다.
  1. 후위 연산자
  • 형식 : x++, x--
  • 동작: 현재 변수의 값을 먼저 사용한 후, 그 값을 증가 또는 감소 시킨다.

📍 단항 연산자 주의사항

단항 연산자는 변수 내의 값에 연산을 하므로 리터럴에 사용할 수 없다.

int intNum1 = 3++ ; //error
int intNum2 = --5; //error

🫧 비교 연산자

비교 연산자는 연산의 결과로 boolean값을 반환한다. - true or false

연산자연산 의미
a == ba와 b는 같다
a != ba와 b는 다르다
a > ba가 b보다 크다
a >= ba가 b보다 크거나 같다
a < ba가 b보다 작다
a <= ba가 b보다 작거나 같다

🫧 2. 실수 자료형

실수 자료형을 이해하기 위해서는 부동소수점에 대한 이해를 먼저 해야한다.

참고 자료
Tistory-inpa-실수표현(부동소수점) 원리 한눈에 이해하기
Youtube-yalco-부동소수점

자료형크기
float4바이트
double8바이트

doublefloat보다 단순히 범위가 넓은 것이 아니라, 보다 정밀한 표현이 가능하다.

📍실수 자료형 주의사항

  • float에는 double을 담을 수 없고, double에는 float을 담을 수 있다.
    • 작은 데이터 타입에 큰 데이터 타입의 값을 담을 수 없고
      큰 데이터 타입에 작은 데이터 타입의 값을 담을 수 있다.

📍 flaot형 주의사항

Java에서 flaot형 변수를 선언할 때 f/F를 사용하지 않으면, 해당 값은 기본적으로 double형으로 간주된다.

f/F을 명시하지 않으면 float형 변수에 double형 값을 할당하는 것으로 해석하므로
컴파일 오류가 발생할 수 있다.

float floatNum1 = 3.14;  //error
float floatNum2 = 3.14f;

🪄 정수형에서 정수형의 리터럴은 기본적으로 int타입으로 간주되어
L을 명시하여 long형임을 알리는 것과 같다.

📍 정수 자료형 long과 실수 자료형의 관계

실수 자료형 floatdouble에 정수 자료형 long의 값을 대입할 때 묵시적 형 변환이 발생한다.

  • 실수 자료형은 정수 자료형보다 더 넒은 범위와 다양한 형태의 숫자를 표현할 수 있어
    안전한 변환으로 간주된다.
  • 예를 들어, 정수 1000을 실수로 변환하면 1000.0 - 데이터 손실이 없다

🪄 단, float은 4바이트(32비트)로 제한되기 때문에 long의 큰 값을 정확하게 표현하지 못해
long에서 float으로 변환할 때는 정밀도 손실이 발생할 수 있다.

📍 float과 double 자료형들 간 연산

  • floatflaot의 연산 결과는 flaot
  • floatdouble의 연산 결과는 double

🪄 단, 실수 자료형의 연산은 부동소수점 방식상 오차가 자주 있다.
부동소수점 오차 해결을 위해서는 BigDecimal 클래스를 사용하면 해결 가능하다.


🪄 정수형과 실수형의 연산

  • 정수형과 실수형의 연산 결과실수를 반환한다.
    • 이 점을 참고해 연산의 결과 반환 시 명시적 형 변환이 필요할 수 있다.
  	int result = 5 / 2.5f;  			// error, 연산 결과는 실수
  
  	int result = (int)(5 / 2.5f); 		// 명시적 형 변환을 통해 해결
  	float result = 5 / 2.5f;			// 결과를 담는 변수의 자료형을 실수형으로 바꿔 해결
  • 정수형과 실수형의 연산 시, 리터럴로 작성할 때 double을 명시하려면 .0을 붙인다.
    • double result = 5/2; 의 경우, 정수 연산 5/2이 먼저 처리되어 소수점 이하는 버려진 2가
      묵시형 형 변환이 일어나 2.0 이 된다.
	double result = 5 / 2 ;		// 연산결과 2.0
	double reulst = 5 / 2.0; 	// 연산결과 2.5
  • 정수 자료형에 실수 자료형의 값을 강제로 넣으면 소수부를 버린다.
    • 그러겠지 당근 ..?
  float floatNum = 3.14f;
  int result = (int)floatNum; 	// 연산 결과 3

🪄 정수형과 실수형의 비교 연산

비교 연산은 정수-실수, 또는 다른 숫자 자료형 간 사용 가능하다.

int intNum = 5;
float floatNum = 5f;
double doubleNum1 = 5.0;
double doubleNum2 = 7.89;

boolean bool1 = intNum == floatNum;
boolean bool2= floatNum == doubleNum1;
boolean bool3= intNum == doubleNum2;
boolean bool4= intNum > dobuleNum2;
boolean bool5 floatNum >= doublueNum2;
boolean bool6 dobuleNum1 < doubleNum2;

🫧 3. 문자 자료형

문자 자료형 char(character)홑따옴표를 사용해 1개의 문자를 표현한다.
문자 자료형의 크기는 2byte를 사용하며, 유니코드상의 문자 표현이 가능하다.

📍 문자 자료형의 특징과 주의사항

  • 각 문자는 상응하는 정수를 가진다.

  • Java는 Uni code표준을 따른다.

    • Uni code전 세계 문자들을 표현하는 표준
    • ASCII codeUni code의 하위 집합으로, 영문자/숫자/일부 특수 문자를 7비트로 표현하는 표준
    • char형은 Uni code 문자를 저장하지만, ASCII code로 표현 가능한 문자에 대해서는 ASCII code값을 그대로 사용한다.
char ch1 = 'A'; 		// 65
char ch2 = 'a'; 		// 97
char ch3 = 'a'+1; 		// b, 98
char ch4 = '가'; 		// 44032
char ch5 = '가'+1; 		// '각' 44033

// 명시적으로 형변환을 하지 않아도 묵시적 형변환 가능
int ch1Int = (int) ch1; 	// ch1Int: 65
int ch5Int = (int) ch5; 	// ch5Int: 44033

int ch1Int = ch1;
int ch5Int = ch5;

//문자 리터럴과 숫자, 유니코드로 표현 가능(모두 A를 표현)
char ch6 = 'A'; 
char ch7 = 65;
char ch8 = '\u0041';

📍 문자 자료형과 정수 자료형의 연산과 형 변환

각 문자는 상응하는 정수를 가진다 를 머리에 박고 시작

char형은 문자 데이터를 저장하지만, 내부적으로 int형으로 저장되기 때문에,
int형과의 연산이 가능하며 문자와 숫자 간의 변환이 용이하다.

  1. charint 변환
    묵시적 형 변환 가능
    char는 2byte, int는 4byte, 데이터 손실이 없다.
char ch1 = 'a'; 		// 유니코드 97
int a1 = ch1;   		// 자동 형 변환
System.out.println(a1); // 출력: 97
  1. intchar 변환
    명시적 형 변환 필요
    int는 4byte, char는 2byte, 데이터 손실 가능성이 있다.
int a2 = 65;  			 // 'A'의 유니코드 값
char ch2 = (char) a2;  	 // 명시적 형 변환
System.out.println(ch2); // 출력: A
  1. charint의 연산 결과는 int

🪄 char와 int의 연산 결과는 항상 int이므로
결과를 다시 char로 사용하고 싶다면 명시적 형 변환이 필요

char ch = 'A';			
int result = ch + 1;				// 'A'의 유니코드 값 65에 1을 더함	
System.out.println(reulst);			// 출력 66
System.out.println((char)reulst);	// 출력 'B'
  1. charchar의 연산 결과도 int

🪄 결과를 다시 char로 사용하고 싶다면 명시적 형 변환이 필요

📌 그니까 char변수char변수의 연산 결과는 int
📌 근데 char리터럴char리터럴의 연산 결과는 char ㅅㅄㅂ

char ch1 = 'a';				// 유니코드 값 97
char ch2 = 'b';				// 유니코드 값 98

int result = ch1 + ch2;		// 두 유니코드 값을 더함, 195
char ch3 = (char)(ch1 + ch2); // 결과를 char로 변환, A
char ch4 = 'a' + 'b';		// A, 195
  1. 리터럴과 변수 연산 시 반환 자료형의 차이
    존나 짜증남 존나 헷갈림 왜 이따위임
  • 문자 리터럴 + 정수 리터럴 = char, int 둘 다 가능
  • 문자 변수 + 정수 리터럴 = char 불가, int 가능
        // 문자 리터럴 +  정수 리터럴 = char, int 둘다 가능
        char chResult = 'A' + 1;
        System.out.println(chResult);	// 출력 B

        int intResult = 'A' + 1;
        System.out.println(intResult);	// 출력 66

        // 문자 변수 + 정수 리터럴 = char 불가, int 가능
        char ch = 'A';
        
        chResult = ch + 2; // error
        
        intResult = ch + 2;
        System.out.println(intResult);	// 출력 67

📍 문자 자료형에서 빈 문자와 공백(space)

char 형에서 빈 문자는 불가, 공백(space)은 가능 - String에서는 빈 문자(열) 가능

char empty ='';		 // error
char space = '  '; 

📍 문자 자료형의 비교 연산

char은 내부적으로 int형으로 저장된다. - 문자와 정수의 비교 연산이 가능하다.

  • 문자와 숫자를 비교할 때 정수형이 아닐 경우, 정수값을 기준으로 비교한다.
boolean bool1 = 'A' == '가';

// 정수값을 기준으로 비교한다. 
boolean bool2 = 'A' == 65;
boolean bool3 = 'A' == 66.0; 		// 정수 66과 비교
booelan bool4 = 'A' == 67f;			// 정수 67과 비교


// 사전 상 먼저 오는 쪽이 작다.
boolean bool5 = 'A' < 'B';
boolean bool6 = '가' > '나';

🫧 4. 불리언 자료형

  • boolean 자료형은 참/거짓(true/false) 둘 중 하나의 값을 가진다.
  • 1바이트(8비트)의 크기를 가진다.
  • 리터럴(true, false)보다는 반환 값으로 많이 사용된다.

📍 불리언 자료형의 연산자

분류연산자연산 의미
부정 연산자!boolean 값을 반전
논리 연산자a && ba와 b가 모두 true일때만 true반환
논리 연산자a ll ba와 b중 하나만 true여도 true반환
삼항 연산자a ? b : ca가 true면 b반환, false면 c반환

🪄 && 연산자가 ||연산자보다 우선순위가 높다.

📍 단축평가(short circuit)

  • && : 앞의 연산이 false면 뒤의 연산을 평가할 필요 없음
  • || : 앞의 연산이 true면 뒤의 연산을 평가할 필요 없음

평가실행을 의미한다.
단축 평가를 이용해 간결한 코드를 작성하고,
실행에 필요한 리소스를 절약하기 위해 연산 부하가 적은 코드를 앞에 작성한다.

📍 삼항 연산자와 단축 평가

조건식의 true / false에 따라 하나의 연산만 수행

int x = 1, y = 2;

int changed1 = x < y ? (x += 2) : (y += 2);
int changed2 = x < y ? (x += 2) : (y += 2);

🫧 5. 문자열 자료형

문자열 자료형 String참조 자료형(Reference Type)이다.
그러나 기본 자료형(Primitive Type)과 유사하게 사용 가능하다.

  • 0 ~ 다수의 문자들로 구성
  • 쌍따옴표("")로 둘러쌈
  • String형은 클래스의 인스턴스
    • 단순 값 뿐만 아니라 특정 기능을 가지고 있다.
  • String형의 생성은 리터럴 방식인스턴스 방식이 있다.

String str1 = "Literal";
String str2 = new String("Instance");

🪄 문자열 리터럴과 인스턴스

📍 문자열 리터럴

  • 문자열을 직접 할당하는 방식으로 생성
  • 리터럴로 생성된 문자열은 메모리 Heap 영역의 String Pool에 저장
  • 같은 리터럴이 여러 번 사용될 경우, 동일한 String Pool의 주소를 참조
    • hl1과 hl2는 동일한 메모리 주소를 참조한다.
    • 메모리 사용을 절약하고, 성능을 최적화하는데 도움된다.
String hl1 = "Hello";
String hl2 = "Hello";

String wld = "World";

📍 문자열 인스턴스

  • new 키워드를 사용해 문자열 객체가 생성
  • new 키워드를 사용하면 매번 새로운 객체가 Heap에 생성되므로,
    동일한 내용의 문자열이라도 서로 다른 주소를 참조
    • hl3과 hl4는 같은 내용의 문자열이지만 서로 다른 객체이며, 서로 다른 주소를 참조
String hl3 = new String("Hello");
String hl4 = new String("Hello");

📍 문자열 리터럴과 인스턴스 비교 연산

  • == 연산 : 두 객체의 참조(주소)를 비교
    • 문자열 리터럴은 같은 내용일 경우, 같은 주소를 참조하므로 == 결과 true
    • 문자열 인스턴스는 같은 내용이더라도 서로 다른 주소를 참조하므로 == 결과 false
  • equals() 메소드 : 두 객체의 내용을 비교
    • 문자열 객체(인스턴스)의 내용이 같다면, 참조가 다르더라도 equals() 결과 true
  • 참조 자료형(Reference Type)의 =(대입) 연산 : 객체의 참조를 복사
    • 실제 객체의 복사본이 아닌, 객체를 가리키는 주소(참조)만 복사
		// 리터럴 생성 방식
        String hl1 = "Hello";
        String hl2 = "Hello";
        String wld = "World";

        //  리터럴끼리는 == 을 사용하여 비교 가능
        boolean bool1 = hl1 == hl2;		// true
        boolean bool2 = hl1 == wld;		// false
				
		// 인스턴스 생성 방식
        String hl3 = new String("Hello");
        String hl4 = new String("Hello");
        
        // hl5는 hl4를 참조하도록 초기화
        // 동일한 객체 참조, 동일한 메모리 주소를 가리킴
        String hl5 = hl4;

        //  💡 인스턴스와 비교하려면 equals() 메소드를 사용
        //   특별한 경우가 아니면 문자열은 equals()로 비교할 것
        boolean bool3 = hl3 == hl4; 	// ⚠️false
				
		// 리터럴, 인스턴스 모두 equals() 사용 가능
        boolean bool4 = hl1.equals(hl2);
        boolean bool5 = hl1.equals(hl3);
        boolean bool6 = hl3.equals(hl4);
        boolean bool7 = wld.equals(hl2);

        //  같은 곳을 참조하는 인스턴스들
        boolean bool8 = hl4 == hl5; 	// ✅true 
        boolean bool9 = hl4.equals(hl5); // ✅true

📍 문자열 자료형의 연산

  • + 연산 : 이어붙인 결과를 반환
  • += 연산 : 해당 변수에 문자열을 이어붙이고, 결과를 반환(부수효과)
    • 상수(final)에는 적용할 수 없음
    • 문자열에서 +=외에 다른 복합 대입 연산자 사용불가

🪄 문자열과 다른 자료형의 + 연산

다른 자료형을 문자열로 취급해 이어붙임

int intNum = 123;
double dbNum = 3.14;
boolean bool = true;
char ch = '가';

String str ="내 밑으로 다 집합";
System.out.println(str + intNum + dbNum + bool + ch);

📍 문자열 자료형의 형 변환

1. 다른 자료형 → 문자열 자료형

  1. String.valueOf()메서드
  • 다양한 데이터 타입을 문자열로 변환
  • 여러 데이터 타입을 지원하기 위해 오버로드된 메서드
String str1 = String.valueOf(3.14f);
String str2 = String.valueOf(true);
  1. + 연산자 이용하기
  • 문자열 + 다른 자료형 = 문자열
  • 문자열 자료형은 ""(공백) 입력이 가능
String str3 = true + "";
String str4 = 123.45+"";

2. 문자열 자료형 → 다른 자료형

Wrapper classparse()메서드

  • Boolean.parseBoolean(String s) 의 경우
    대소문자를 구분하지 않고 "true" 라고 정확하게 매칭되는 문자열만 true로 변환하고, 그 외에 모든 문자열에 대해서는 false를 반환한다.
  • CharacterparseCharacter() 메서드가 없다.
    • charAt() 메서드로 문자열을 문자로 변환
      String 클래스 메서드로, 문자열에서 특정 인덱스에 있는 문자를 반환한다.

// String - char
String str = "난 짱이다";
char ch = str.chatAt(2);	// '짱'

String str = "123";

// String - 정수
byte byteNum = Byte.parseByte(str);
short shtNum = Short.parseShort(str);
int intNum = Integer.parseInteger(str);
long longNum = Long.parseLong(str);

// String - 실수
float fltNum = Float.parseFloat(str);
double dbNUM = Double.parseDouble(str);

// String - boolean 
boolean bool1 = Boolean.parseBoolean(str); 		// false
boolean bool2 = Boolean.parseBoolean("TRUE");	// true
boolean bool3 = Boolean.parseBoolean("True");	// true
boolean bool4 = Boolean.parseBoolean("true");	// true

🪄 런타임 에러

Wrapper Classparse()메소드 중 문자열을 숫자로 변환하는 과정에서
해당 문자열이 적절한 숫자 형식이 아니면 NumberFormatException 런타임 에러가 발생한다.

byte byteNum = Byte.parseByte("12345");  		// 범위 초과
int intNum = Integer.parseInteger("123.45"); 	// 부적절한 형식
double dbNum = Double.parseDouble("하나");		// 부적절한 형식

🪄 이스케이프 표(escape sequence)

이스케이프 문자표현
\"큰 따옴표
\'작은 따옴표
\n줄바꿈(개행)
\t
\\ 백슬래시 하나

🫧 5-1. 문자열 메서드

🪄 문자열의 중요한 특징 - immutable

불변성의 개념

  • 불변성이란 객체가 생성된 후 그 상태(내부 데이터)가 변경될 수 없는 특성이다.
  • String 객체는 불변성을 가지므로, String 객체가 한 번 생성되면 그 객체의 내용을 바꿀 수 없다.
  • String 객체의 불변성은 String 클래스에서 제공하는 모든 메서드
    원본 문자열을 변경하지 않고, 항상 새로운 String 객체를 반환하는 방식으로 구현된다.

String은 왜 불변성을 가질까?

  • 보안(Security)
  • 동기화(Synchronization)
  • 성능 및 메모리 효율성
  • 캐싱(Caching)

불변성의 작동 방식

  1. 문자열 연산
    문자열을 수정하는 것처럼 보이는 연산을 수행할 때마다,
    자바는 기존의 String객체를 수정하지 않고, 새로운 String객체를 생성한다.
  1. 복합 대입 연산자
    += 연산자를 생성하면, 새로운 String 객체가 생성되고,
    기존의 객체는 변경되지 않는다.

위의 코드에서 "삼겹살" 문자열이 str에 할당된 후, str.concat() 메서드를 통해 "삼겹살항정살", "삼겹살항정살냉면", "삼겹살항정살냉면껍데기" 라는
새로운 String 객체들이 생성된다.

str이 가리키는 참조가 바뀌는 것이고, 그 전의 문자열 객체들은 여전히 변경되지 않고 그대로 메모리에 남아있다.

또 중요한 점은 concat 메서드는 원래 문자열(str)을 변경하는 것이 아니라,
새로운 문자열을 생성해서 반환한다는 것이다. - String의 불변적 특성


📍문자열 메서드

메서드메서드 동작사용예시리턴값
length()문자열 길이 반환str.length()int
isEmpty()문자열의 길이가 0인지 확인str.isEmpty()bool
isBlank()공백문자를 제외한 문자열 길이가 0인지 확인str.isBlank()bool
trim()문자열 앞뒤 공백 제거 트리밍str.trim()String
charAt(index)문자열에서 index위치의 문자 반환str.charAt(5)char
indexOf(문자 또는 문자열)문자열에서 문자 또는 문자열의 위치 반환str.indexOf("대박")int
lastIndexOf(문자 또는 문자열)문자열에서 문자 또는 문자열이
마지막으로 등장하는 위치 반환
str.lastIndexOf("이다")int
equals(문자열)두 문자열이 동일한 내용인지 비교
(대소문자 구분)
str1.equals(str2) 또는
"안녕".equals("안뇽")
bool
equlasIgnoreCase()두 문자열이 동일한 내용인지 비교
(대소문자 무시)
equals() 참고bool
contains(문자열)문자열이 특정 문자열을 포함하는지 확인str.contains("짱")bool
startsWith(문자열)문자열이 특정 문자열로 시작하는지 확인str.startWith("나는")bool
endsWith(문자열)문자열이 특정 문자열로 끝나는지 확인str.endsWith("이다")bool
compareTo(문자열)서로 다른 문자열을 (대소문자를 구분하여)
사전적 비교에 따라 음수/양수 반환
str1.compareTo(str2)int
compartToIgnoreCase(문자열)서로 다른 문자열을 (대소문자를 무시하고)
사전적 비교에 따라 음수/양수 반환
compareTo() 참고int
toUpperCase()문자열을 모두 대문자로 변환str.toUpperCase()String
toLowerCase()문자열을 모두 소문자로 변환str.toLowerCase()String
concat(문자열)두 문자열 연결str.concat("이어붙이기")String
repeat(정수)문자열을 주어진 정수만큼 반복str.repeat(3)String
substring(begin, end)문자열을 begin부터 end까지 잘라오기str.substring(5, 7)String
replace(old, new)문자열의 old문자열을 new문자열로 치환str.replace("밥", "빵")String
toCharArray()문자열을 분할하여 문자 배열로 반환char[] arr=str.toCharArray()char[ ]
split(구분자)문자열을 구분자 기준으로 분할하여
문자열 배열로 반환
String[ ] arr = str.split(",");String[]

🪄 문자열 메서드 참고사항

  1. compareTo(), comparToIgnoreCase()
  • 두 문자열이 같은 문자열이면 0을 반환
  • 두 문자열이 시작하는 부분은 동일하지만 다른 문자열이면, 글자 길이의 차이 반환
  • 두 문자열이 시작하는 부분이 다른 문자열이면, 첫 글자의 유니코드 값 차이 반환

🪄 문자열 메서드 참고사항 - concat(), +연산

  1. 이어붙이기 대상
    concat()문자열끼리만 이어붙이기 가능
    + 연산은 다른 자료형을 문자열로 취급해 이어붙이기 가능

  2. 인스턴스 생성
    concat()필요시에만 새 인스턴스 생성
    str.concat(""); 과 같은 코드는 새 인스턴스를 생성하지 않음.

    + 연산은 새 인스턴스 생성
    str + ""; 과 같은 경우에도 새 인스턴스를 생성

  3. null과의 관계
    concat()null과 이어붙이기 불가
    null과 이어붙이면 NullPointException 발생

    +연산은 null과 이어붙이기 가능
    str1 + null + "ABC"; 가능


🫧 5-2. 문자열 포매팅

📍 format(), formatted()

format() : 정적 메서드, 클래스 이름(String)을 사용해 호출
formatted() : 인스턴스 메서드, 포메팅이 필요한 문자열 객체에서 바로 호출

String profile = "Name: %s, Age: %d";
String name = "Haley";
int age = 28;

// 변수에 저장하는 방식
String formatString1 = String.format(profile, name, age);
String formattedString2 = profile.formatted(name, age);

// 바로 출력하는 방식
System.out.println(String.format("Name: %s, Age: %d", name, age));
System.out.println("Name: %s, Age: %d".formatted(name, age));

📍 포맷 지정자

포맷 지정자데이터 타입
%sString
%dInteger
%fFloat
%cCharacter
%bBoolean
%tDate/Time
%n포맷 문자열 내 줄바꿈

🫧 5-3. null 문자열

📍참조 자료형과 원시 자료형에서 null

Java에서 null참조 자료형과 원시 자료형에서 다르게 동작한다.
이 차이는 메모리 관리변수 선언 방식에서 비롯된다.

1. 🪄 참조 자료형(Reference Type)
참조 자료형은 객체를 참조하는 타입으로, 객체의 메모리 주소를 저장한다.

  • 참조 자료형 변수는 Heap 영역에 있는 객체의 메모리 주소를 저장한다.
    • 객체의 주소를 가진 변수는 Stack 에 저장
    • 실제 객체는 Heap 에 저장된다.
  • 초기화하지 않은 참조형 변수는 null을 기본값으로 가진다.
    • 초기화된 참조형 변수에 null을 할당하면,
      변수는 더이상 어떤 객체도 참조하지 않는다.
      이때 참조되지 않는 객체는 Garbage Collector에 의해 Heap에서 제거된다.
  • null아무것도 참조하지 않는다는 것을 의미한다.
  • 참조 자료형 변수에 null이 할당되면 해당 변수는 어떤 객체도 참조하지 않으며,
    이 상태에서 메서드를 호출하려고 하면 NullPointerException이 발생할 수 있다.

2. 🪄 원시 자료형(Primitive Type)
원시 자료형은 가장 기본적인 데이터 타입으로, 메모리에 직접 값을 저장한다.

  • 원시 자료형은 Stack 영역에 직접 값을 저장
  • 원시 자료형 변수는 항상 값을 가지고 있으며, null을 할당할 수 없다.
  • 초기화하지 않은 원시형 변수는 각 타입의 기본값을 가진다.

    📍 null 문자열

    빈 문자열(길이가 0) : Heap영역에 자리를 차지
    null문자열 : Heap영역에 할당되지 않음(참조하는 곳이 없음)

🫧 6. 배열

같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여한 자료구조

📍 배열의 특징

  1. 같은 타입의 데이터만 저장할 수 있다.
  2. 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없다.
    (지정된 자료형과 개수만큼 메모리 공간을 확보)
  3. 배열은 참조 자료형이다.
  4. 배열 객체는 Heap 영역에 생성되고 배열 변수는 Heap 영역의 배열 객체를 참조한다.

📍 배열 선언과 생성

  1. 값 목록으로 생성
    타입[] 변수 = {값1, 값2, 값3 ... };

⚠️배열 변수를 이미 선언한 후에 다른 실행문에서 중괄호를 이용한 배열 생성 불가

String[] names;
names = {"한놈", "두시기", "석삼", "너구리"}; // error

배열 변수를 미리 선언한 후 값 목록들이 나중에 결정되는 상황일때 new연산자 이용

String[] names;
names = new String[]{"한놈", "두시기", "석삼", "너구리"};
  1. new 연산자로 생성
    타입[] 변수 = new 타입[]{값1, 값2, 값3 ...};
    또는
    타입[] 변수 = new 타입[길이]; - new연산자로 생성시, 배열은 기본값으로 초기화

📍 배열 길이 length와 length()

  • length : 배열을 대상으로 배열의 길이(배열 요소의 수)를 나타내는 int형 필드
  • length() : 문자열을 대상으로 문자열의 길이를 반환하는 int형 메서드

📍 다차원 배열

2차원 이상의 다차원 배열로, 상위 배열은 하위 배열의 주소값을 가진다.

int[][] scores = new int[2][3];
  • scores.length : scores배열의 행의 개수 - 배열의 첫 번째 차원
  • scores[0].length : scores배열의 첫 번째 행의 열의 개수
  • scores[1].length : scores배열의 두번째 행의 열의 개수

Stack
참조 변수 scores - 첫 번째 차원(배열의 행)을 가리키는 메모리 주소 저장

Heap
scores가 참조하는 행 배열 생성

  • 행 배열의 각 요소 scores[0], scores[1]은 하위 배열을 가리키는 참조 변수로 사용

scores[0]이 가리키는 하위 배열 생성
scores[1]이 가리키는 하위 배열 생성

📍문자열 배열과 문자열

split(구분자) : 문자열 → 배열, 문자열을 구분자로 나누어 배열로 반환

String namesString = "한놈 두시기 석삼 너구리";
String namesArray = namesString.split(" "); 

join(구분자) : 배열 → 문자열, 배열 요소 사이에 구분자를 삽입해 문자열 생성

String[] namesArray = {"한놈", "두시기", "석삼", "너구리"};
String namesString = String.join(" ", namesArray);

🫧 7. 열거 타입

요일 : 월, 화, 수, 목, 금, 토, 일
계절 : 봄, 여름, 가을, 겨울

위와 같이 한정된 값만을 갖는 타입열거 타입(Enumeration Type) 이라고 한다.

  • 특정한 상수들의 집합을 정의하는 특수한 데이터 타입
    • 열거 상수(Enumeration Constant)
  • 의미있는 이름으로 상수들을 그룹화하여 연관있는 상수들을 편리하게 관리한다.
  • 타입 안정성을 보장

📍 열거 타입 선언과 생성 및 사용

enum Day {
	SUNDAY, MONDAY, THUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY

}

public class Main{
	public static void main(String[] args){
    	Day today = Day.SUNDAY;
        System.out.println(today);
    }
}

📍 열거 타입 특징

  • 열거 타입은 참조 타입이므로, 열거 타입 변수는 null을 할당할 수 있다.
    • 참조 타입 변수는 객체를 참조한다.
    • 열거 타입 변수는 열거 상수 객체를 참조한다.
  • 열거 타입은 일종의 클래스이고, 상수 하나당 인스턴스를 하나씩 만들어
    public static final 필드로 공개한다.

  • Method 영역에 열거 타입 클래스가 올라간다. - 열거 타입은 일종의 클래스
    • Method 영역에 생성된 열거 상수가 객체를 각각 참조한다.
  • Heap 영역에 실제 객체(인스턴스)가 올라간다.
  • Stack 영역에 열거 타입 변수가 올라간다.
    • 열거 타입 변수 todayWeek.SUNDAY열거 상수가 참조하는
      객체의 메모리 주소 저장된다.

📍 열거 타입 메소드

열거 타입은Enum 클래스를 상속한다.
따라서 열거 타입에서 사용할 수 있는 메소드는 Enum 클래스에서 제공하는 메소드다.

메소드메소드 동작사용 예시리턴값
name()열거 상수의 이름 반환today.name();String
ordinal()열거 상수가 정의된 순서 반환today.ordinal()int
valueOf(String name)주어진 이름과 일치하는 열거 상수 반환Week.valueOf("Modnay");Week(열거 상수)
values()모든 열거 상수를 배열로 반환Week.values();Week[](열거 상수 배열)

휴 큰일했다 ..

ref

Youtube_Yalco_Java
velog.io_@ur2e
hudi.blog

profile
"개발자는 해결사이자 발견자이다✨" - Michael C. Feathers

0개의 댓글