본문 바로가기
BACK-END/JAVA

JAVA | 251119

by codechu 2025. 11. 20.

연산자

  • 연산자란 =, > , / 등..
  • 피연산자란 연산자로 인해 처리가 될 값들을 이야기 함

할당 연산자

  • 일반 할당(=) : x = y 꼴에서 x에 y를 대입한다.
  • 더하기 복합 대입 연산(+=) : x += y 꼴에서 x와 y를 더한 값을 x에 재할당한다.
  • 빼기 복합 대입 연산(-=) : x -= y 꼴에서 x에서 y를 뺀 값을 x에 재할당한다.
  • 곱하기 복합 대입 연산(=) : x = y 꼴에서 x와 y의 곱을 x에 재할당한다.
  • 나누기 복합 대입 연산(/=) : x /= y 꼴에서 x를 y로 나눈 몫을 x에 재할당한다.
  • 나머지 복합 대입 연산(%=) : x %= y 꼴에서 x를 y로 나눈 나머지를 x에 재할당한다.

비교 연산자

  • 동등(==) : x == y 꼴에서 x와 y의 스택 값이 같은가의 여부이다. (문자열 내용은 비교하지 않음! 문자열은 equals() 사용!)
  • 부등(!=) : x != y 꼴에서 x와 y의 스택 값이 다른가의 여부이다.
  • 초과(>) : x > y 꼴에서 x가 y보다 큰가의 여부이다.
  • 미만(<) : x < y 꼴에서 x가 y보다 작은가의 여부이다.
  • 이상(>=) : x >= y 꼴에서 x가 y보다 크거나 같은가의 여부이다.
  • 이하(<=) : x <= y 꼴에서 x가 y보다 작거나 같은가의 여부이다.
  • 초과, 미만, 이상, 이하 연산자의 피연산자는 그 두 피연산자의 타입이 같거나, 하나가 다른 하나의 타입으로 묵시적 형변환이 가능한 형태의 논리값(boolean)을 제외한 숫자이거나 이를 감싸는 참조 타입(byte, short, integer, long, float, double 등)이어야 한다.
  • 동등, 부등 연산자의 피연산자는 그 두 피연산자의 타입이 같거나 하나가 다른 하나의 타입으로 묵시적 형변환이 가능한 형태여야 한다.

산술 연산자

  • 더하기(+) : x + y 꼴에서 x와 y의 합이다.
  • 빼기(-) : x - y 꼴에서 x에서 y를 뺀 값이다.
  • 곱하기() : x y 꼴에서 x와 y의 곱이다.
  • 나누기(/) : x / y 꼴에서 x를 y로 나눈 몫이다.
  • 나머지(%) : x % y 꼴에서 x를 y로 나눈 나머지이다.
  • 단항 양수(+) : +y 꼴에서 변수 x의 부호를 강조한다.
  • 단항 음수(-) : -y 꼴에서 변수 x가 가지는 값의 부호를 반전한다.
  • 증가(++)
    • 전위 증가 : ++x 꼴에서 구문 실행전 x에 i를 더한다.
    • 후위 증가 : x++ 꼴에서 구문 실행후 x에 i를 더한다.
  • 감소(--)
    • 전위 감소 : --x 꼴에서 구문 실행전 x에 i를 뺀다.
    • 후위 감소 : x-- 꼴에서 구문 실행후 x에 i를 뺀다.
  • 숫자 타입(양수, 실수)간의 사칙연산 결과는 두 피연산자의 타입이 같다면 반드시 동일 타입으로 연산된다.
  • 숫자 타입간의 사칙연산 중 두 피연산자의 타입이 다르면 보다 큰 타입으로 연산된다.
  • 단, 사칙 연산의 두 피연산자 혹은 일부 산술 연산자의 피연산자의 타입이 int미만의 정수 타입(byte, short)인 경우 그 연산 결과는 int이다.
System.out.println(5 + 5L) => 10L
** 10/3이 왜 3이 나오냐 하면 두 피연산자 타입이 같아 동일 타입으로 나왔기 때문 (타입이 정수라 소수점 버림)
  • byte a = 5;
    byte b = a; - 괜찮
    byte c = -a; - 터짐 (-a는 int라서)

논리 연산자

  • 논리 AND(&&) : x && y 꼴에서 x와 y가 모두 참(true)인가의 여부이다.
  • 논리 OR(||) : x || y 꼴에서 x와 y중 하나가 참(true)인가의 여부이다.
  • 논리 NOT(!) : !x 꼴에서 x의 논리를 부정(반전)한다.

삼항 연산자

  • 삼항 연산자(? :) : c ? t : f 꼴에서 조건 c가 참(ture)이라면 t, 거짓(false)라면 f가 된다.

기타 연산자

  • 멤버 접근(.) : x.y 꼴에서 x의 멤버인 y에 접근하기 위해 사용한다.
  • 배열 인자 접근([]) : x[y] 꼴에서 배열인 x의 인자 중 인덱스가 y인 인자에 접근하기 위해 사용한다.
  • 객체화(new) : new T 꼴에서 타입 T를 객체화하기 위해 사용한다.
  • 메서드 호출(()) : f() 꼴에서 메서드 f를 호출하기 위해 사용한다.
  • 우선 연산(()) : (x) 꼴에서 연산 x를 우선하기 위해 사용한다.
  • 단항 형 변환((T)) : (T) x 꼴에서 x의 타입을 강제로(명시적으로) T로 변환한다.
  • 타입 비고(instanceof) : x instanceof T 꼴에서 (기초 타입이 아닌) 값 x가 (참조) 타입 T로 형변환될 수 있는가의 여부이다.

연산자의 우선순위

  1. 우선 연산, 메서드 호출, 배열 인자 접근, 멘버 접근((), (), [], .)
  2. 후위 증가, 후위 감소(++, --)
  3. 전위 증가, 전위 감소, 단항 양수, 단항 음수, 논리 NOT(++, --, +, -, !)
  4. 객체와(new)
  5. 곱하기, 나누기, 나머지(*, /, %)
  6. 더하기, 빼기(+, -)
  7. 초과, 미만, 이상, 이하, 타입 비고(>, <, >=, <=, instanceof)
  8. 동등, 부등(==, !=)
  9. 논리 AND(&&)
  10. 논리 OR(||)
  11. 삼항 연산자(? :)
  12. 할당, 복합 대입 연산(=, +=, -=, *=, /=, %=)

반복문

for

  • for 반복문은 반복의 기준이되는 변수(주로 인덱스)를 활용하여 특정 구현부를 반복 실행하고자 할 때 사용한다.
for([변수 선언 및 초기화]; [반복 조건]; [변수 가감 및 할당]) {
	[구현부]
}
1. for 반복문을 위한 변수 선언 및 초기화를 실행한다.
2. 반복 조건이 참(true)인지 확인한다.
  - 반복 조건이 참(true)이라면 구현부를 1회 실행하고, 3으로 이동한다.
  - 반족 조건이 거짓(false)이라면 for반복문 실행을 즉시 중단한다.
3. 변수 가감 및 할당을 실시하고 2로 돌아간다.

형성된 for(Enhanced for) -> js의 for...of와 용법 비슷

  • 형성된 for(Enhanced for) 반복문은 반복할 수 있는 대상이 가지는 인자에 대해 반복하기 위해 사용한다.
  • 인덱스가 필요 없을 경우 인덱스 범위 오류 최소화 및 가독성 향상 등을 위하여 가능한한 형성된 for 반복문을 사용하는 것이 좋다.
for ([변수 선언] : [반복 대상]) {
	[구현부]
}
-> JS : for (let num of nums) {}
   자바스크립트 : for (int num : nums) {}

while

  • while 반복문은 주어진 조건이 참(true)일때 횟수와 관계 없이 구현부를 실행하기 위해 사용한다.
while ([조건]) {
	[구현부]
}
- 만약 조건이 항상 참(true)이거나 거짓(false)으로 변하는 경우의 수가 없다면, 혹은 break 혹은 return등의 중단 키워드가 없는 경우 무한히 반복됨으로 유의해야한다.

do ... while

  • do...while 반복문은 while 반복문과 유사하나 조건과 관계 없이 최초 한번은 반드시 구현부를 실행한다는 차이점이 있다.
do{
	[구현부]
} while ([조건]);
- 만약 조건이 항상 참(true)이거나 거짓(false)으로 변하는 경우의 수가 없다면, 혹은 break 혹은 return등의 중단 키워드가 없는 경우 무한히 반복됨으로 유의해야한다.

배열

  • 배열(Array)은 하나의 변수로 동일하거나 호환되는(묵시적 형변환이 가능한) 타입의 값을 여러개 가질 수 있도록 하기 위해 사용한다.
  • 배열은 비록 이가 가질 인자의 타입이 기초 타입이라 하더라도 메모리의 작동 방식은 참조 타입과 같다. 고로 null값을 가질 수 있다.
    ** 기초 타입은 null일 수 없고(배열은 null일 수 있음), 참조 타입은 null일 수 있음
String a = null; -> 참조 / null o
int i = null; -> 기초 / null x
int[] = null; -> 기초 / 배열은 null일 수 있음!
  • 변수 선언 시 타입에 대괄호([])를 활용하여 해당 변수가 배열임을 나타낸다.
let arr = [1, 2, 'hello', true]
  • 배열의 이름은 주로 복수형으로 짓거나, 접미어로 Array를 붙여 짓는 편이다.
T[] 이름;
- 가령 함수(int) 배열인 nums는 아래와 같이 선언한다.
int[] nums;

초기화

  • 배열의 초기화는 인자의 나열 혹은 배열의 길이 지정 중 하나여야 한다.
  • 배열이 초기화된 후에는 다시 초기화하는 방법 외에 배열이 가질 수 있는 인자의 개수를 줄이거나 늘릴 수 없음을 유의한다.
  • 배열이 가질 인자의 나열은 아래 방식으로 한다.
T[] ts = new T[] {...};
- 가령 함수(int)배열에 대해 인자로 1, 2, 3을 가지는 배열의 초기화는 아래와 같이 할 수 있다.
int[] nums = new int[] {1, 2, 3};
- 혹은 아래와 같이 문맥상 그 타입이 정확한 경우 객체화 연산자를 선택할 수 있다.
int[] nums = {1, 2, 3} -> "hello" 이런건 못들어감. int배열이기 때문
  • 배열의 길이 지정은 아래 방식으로 한다.
T[] ts = new T[n];
- 가령 정수(int)배열에 대해 길이가 3인 배열의 초기화는 아래와 같이 할 수 있다.
int[] nums = new int[3]
- 길이 지정을 통해 초기화된 배열이 가지는 모든 인자는 기본 값으로 초기화되며 기본 값은 아래와 같다.
  - 함수 및 실수 등 숫자 기초 타입 : 0
  - 문자 기초 타입 : \0
  - 논리 기초 타입 : false
  - 모든 참조 타입 : null
  • 인자의 나열과 배열의 길이 지정을 동시에 사용하여서는 안된다.
int[] nums = new int[3] {1, 2, 3}; -> 안됨
int[] a = {1, 2, 3}; 이나 int[] b = new int [3]; 각각 쓰는건 됨
- 위와 같이 동시에 배열의 길이도 지정하고[3], 인자도 나열{1, 2, 3}하여서는 안된다.

인자

  • 배열은 배열이 가지는 각 인자에 대해 인덱스를 가지고 있는데, 이 인덱스는 반드시 0부터 시작하여 1씩 증가한다.
  • 배열이 가지는 인자에 인덱스로 접근하기 위해서는 벼열 변수에 대해 대괄호([])를 사용할 수 있다.
int[] odds = {1, 3, 5, 7, 9};
System.out.println(odds[1]); // 3
System.out.println(odds[3]); // 7
  • 배열이 가지고 있는 인자의 값을 재할당하고자 할 때 그 인덱스로 접근하여 재할당할 수 있다.
int[] odds = {1, 2, 5, 7, 9};
System.out.println(odds[1]); // 2
odds[1] = 3;
System.out.println(odds[1]); // 3
  • 배열이 가지고 있는 인자의 개수를 가지고 잇는 속성은 length이다.
int[] odds = {1, 3 ,5, 7, 9};
System.out.println(odds.length); // 5
- 인자를 가지는 모든 배열이 length 속성 값에서 i를 뺀 값은 항상 마지막 인자의 인덱스이다.
- 배열이 가지고 있는 인자의 인덱스 범위를 벗어난 인자에 접근할 경우 ArrayIndexOutOfBoundsException 예외(Exception)가 발생함으로 유의한다.
  • 배열이 가지고 있는 메서드(clone)을 호출하여 동일한 인자를 가지는 배열을 반환받을 수 있다.
int[] oddOriginal = {1, 3, 5, 7, 9};
int[] odds = oddOriginal.clone();
  • 배열의 메모리 생태는 참조 타입과 같음으로 비록 그 인자의 구성이 동일하다 하더라도 배열간에 동부동 비교를 하지 않도록 한다.
int[] nums1 = {1, 3, 5};
int[] nums2 = {1, 3, 5};
System.out.println(nums1 == nums2); //false

int[] nums1 = {1, 3, 5};
int[] nums2 = nums1; -> nums1과 같은 객체
nums2[1] = 1000;
System.out.println(nums1[1]); //1000
* clone : int[] nums2 = nums1.clone(); -> nums1과 다른 객체 (복사해서 새롭게 만드는)

메서드 (함수)

  • 메서드(메소드, Method)는 클래스 혹은 인터페이스 등의 구성요소가 가지는 멤버(Member)중 하나이며, 호출(Call, invoke) 가능한 동작 단위인 대상이다.
  • 메서드 구현부 작성시, 메서드의 이름에 따라 최소한의 역할만 하도록 로직을 작성하는 것이 중요하다.
  • 명명법 : 카멜 케이스(V(동사), V+D(동사+명사), (be)+Ad(be+Adjective))
  • 메서드의 구조는 아래와 같다.
[접근 제한자][abstrac][final][static]? [반환 타입][void][메서드 이름]([매개 변수,...]){
	[구현부]
}
- abstrac: 해당 메서드가 추상 메서드임을 의미한다.
  - 추상 메서드의 접근 제한자는 private일 수 없다.
  - 추상 메서드는 정적(static)일 수 없다.
  - 추상 메서드는 구현부를 가지지 않아야 한다.
  - 추후 해당 메서드를 멤버로 가지는 클래스를 상속 받거나 인터페이스를 구현하는 대상으로 하여금 해당 메서드의 구현부를 직접 구현하도록 하여야 한다.
  - 추상 메서드를 멤버로 가지는 대상은 추상 클래스이거나 인터페이스여야 한다.
- final: 해당 메서드가 최종적임을 알린다.
  - 최종적인 메서드는 재정의(Override) 할 수 없다.
  - 최종적인 메서드는 추상적(abstract)일 수 없다.
  - 해당 메서드의 구현부가 절대적이고 앞으로 변하여서는 안 되는 로직을 가지는 경우 이를 최종적으로 만들어 보호한다.
- static: 해당 메서드가 정적임을 의미한다. 정적인 메서드는 주로 유틸리티성을 가지며, 객체가 아닌 타입의 이름으로 접근할 수 있다.
  - 정적인 메서드는 추상적(abstract)일 수 없다.
  - 정적인 메서드는 재정의 대상이 아님으로 최종적(final)일 필요가 없다.
  - 정적인 메서드는 이를 가지고 있는 타입이 객체화되지 않아도 프로그램이 실행될 때 그 존재가 메모리에 등록된다.
- void: 해당 메서더의 반환 값이 없음을 의미한다. 호출 결과로 어떠한 값도 반환(return)할 수 없다. (단, 메서드 종료를 위한 단순 return은 사용 가능)
  - 반환 타입이 있는 경우 명시적으로 예외를 던지는(throw) 경우를 제외하고 모든 경우의 수에서 값을 반환(return)하여야 한다.
** 자바는 모든 흐름에 return이 있어야 함 / void인 경우는 제외

매개 변수

  • 매개 변수(Parameter)는 메서드가 요구하는 변수 구성이다.
  • 해당 메서드를 호출할 때 요구되는 매개 변수에 대해 전달하는 값을 전달 인자(Argument)라고 한다.
  • 명명법: 카멜 케이스
  • 매개 변수의 구조는 아래와 같고 쉼표(,)로 구분하여 여러개 작성할 수 있다.
[final]? [타입] [이름]

가변 인자

  • 가변 인자(Variable Argument)는 실질적으로 배열이지만 호출자로 하여금 단순히 쉼표(,)로 구분하여 전달 인자를 쉽게 전달할 수 있게하기 위해 사용한다.
[final]? [타입]... [이름]
- 위와 같이 타입 뒤에 ... 을 붙여 이가 가변 인자임을 지정한다.
public static void main(final String[] args){
	int sum = sum(1, 2);
}

public static int sum(int... nums){ -> ...말고 [] 넣으면 터짐
	int sum = 0;
    for (const num of nums) {
    	sum += num;
    }
    return sum;
}
  • 단, 매개 변수 구조상 가변 인자는 반드시 마지막에 위치하여야 한다.
public static int sum(int first, int... nums){
}
- 위 구조는 가변 인자 nums가 마지막 매개 변수임으로 구조상 문제가 없다.
public static int sum(int first, int... nums, boolean unsafe){
}
- 위 구조는 가변 인자 nums가 마지막 매개 변수가 아님으로 올바르지 않은 구조이다.

String 클래스

  • String(java.lang.String) 클래스는 문자열 리터럴이며, 문자열과 관련된 기능을 제공한다.

정적 메서드 (타입이름. 해서 접근)

  • copyValueOf(char[] c) : 문자 배열 c가 가진 문자(char)들을 이어 붙인 문자열을 반환한다. valueOf(char[] c)와 같음
char[] chars = {"h", "i"};
String str = String.valueOf(chars);
Sytem.out.println(str); -> hi
  • format(String s, Object... os) : 주어진 형식 s에 맞도록 하나 이상의 값 os를 순차적으로 대입한 문자열을 반환한다. 형식 s에는 아래와 같은 표현식을 사용할 수 있다.
    • ★ %d : 정수형(byte, short, int, long) 타입
      • %,d : 천 자리 단위를 쉼표로 구분하여 대입
      			int num = 10000000;
      String message = String.format("인구: %,d". num);
      			```
      - %xd : 자리수를 x자로 맞추어, 부족한 자리수 만큼 선행하는 공백을 추가하여 대입
      - %0xd : 자리수를 x자로 맞추어, 부족한 자리수 만큼 선행하는 0을 추가하여 대입
      - %-xd : 자리수를 x자로 맞추어, 부족한 자리수 만큼 후행하는 공백을 추가하여 대입
      - %,xd, %0,xd, %,-xd 등의 형태로 조합하여 사용할 수 있다. 단 천 자리 단위를 구분하기 위한 쉼표 또한 자리수(x)에 포함된다.
    • ★ %f : 실수형(float, double) 타입
      • %,f : 천 자리 단위를 쉼표로 구분하여 대입
      • %xf : 자리수를 x자로 맞추어, 부족한 자리수 만큼 선행하는 공백을 추가하여 대입. 단, 소수점을 표현하기 위한 마침표 또는 자리수(x)에 포함된다.
      • %0xf : 자리수를 x자로 맞추어, 부족한 자리수 만큼 선행하는 0을 추가하여 대입. 단, 소수점을 표현하기 위한 마침표 또는 자리수(x)에 포함된다.
      • %-xf : 자리수를 x자로 맞추어, 부족한 자리수 만큼 후행하는 공백을 추가하여 대입. 단, 소수점을 표현하기 위한 마침표 또는 자리수(x)에 포함된다.
      • %.nf : 소수점 n까지만 표시하고, 나머지는 반올림하여 대입
      • %x.nf, %0x.nf, %-x.nf, %,xf, %,x.nf, %,-x.nf 등의 형태로 조합하여 사용할 수 있다. 단 천 자리 단위를 구분하기 위한 쉼표 또한 자리수(x)에 포함된다.
    • ★ %n : 개행자 대입(\n과 동일)
    • ★ %s : 문자열(String) 대입 (숫자를 넣어도 됨)
      • %xs : 자리수를 x자로 맞추어, 부족한 자리수 만큼 선행하는 공백을 추가하여 대입
      • %-xs : 자리수를 x자로 맞추어, 부족한 자리수 만큼 후행하는 공백을 추가하여 대입
      • %.xs : 최대로 출력될 수 있는 문자열의 길이를 n으로 제한하여 대입
      			String message = String.format("%.10s(인)", "가나다라마바사아자차카타파하");
      			```
String.format(""); -> format은 정적

int age = 22;
String name = "김갑수";
String message= String.format("나이는 %d살, \n 이름은 %s입니다.", age, name);
  • join(CharSequence d, CharSequence... c) : 가변인자 c의 인자를 d로 이어붙인 문자열을 반환한다.
String.message = String.join("-","2025","11"); -> 2025-11
  • valueOf(char[] c) : 문자 배열 c가 가진 문자(char)들을 이어 붙인 문자열을 반환한다. copyValueOf(char[] c)와 같음
  • valueOf(byte|short|int|long|float|double|bolean|char) : 기초 타입의 값 x가 가진 내용을 문자열로 반환한다.
  • valueOf(Object o) : 전달되는 o가 가진 toString() 메서드의 호출 결과를 반환한다.

객체 메서드(비정적) (변수이름. 해서 접근)

  • charAt(int i) : 호출 대상인 문자열이 가지는 문자 중 1번째 문자(char)를 반환한다. 인덱스는 0번 부터 시작함에 유의
  • concat(String s) : 호출 대상인 문자열이 가지는 내용 끝에 전달 받은 문자열 s를 이어 붙인 새로운 문자열을 반환한다. 호출 대상인 문자열과 전달 받은 문자열의 내용에는 변화가 없음에 유의
  • contains(CharSequence c) : 호출 대상인 문자열의 내용에 인자 s가 포함되어 있는가의 여부를 반환한다.
  • endsWith(String s) : 호출 대상인 문자열의 내용이 s로 끝나는가의 여부를 반환한다.
  • startsWith(String s) : 호출 대상인 문자열의 내용이 s로 시작하는가의 여부를 반환한다.
  • equals(Object o) : 전달 받은 인자 o가 문자열이라면 호출 대상인 문자열이 가지는 내용과 o가 가지는 내용이 같은가의 여부를 반환한다.
  • equalsIgnoreCase(String s) : equals와 동일하나 대소문자를 구문하지 않는다.
String s1 = new String("hi");
String s2 = new String("HI");
System.out.println(s1.equals(s2)); //flase
System.out.println(s1.equalsIgnoreCase(s2)); //true
  • indexOf(String s) : 호출 대상인 문자열이 가지는 내용 중 s와 일치하는 첫번째 인덱스를 반환한다. 일치하는 내용이 없다면 -1을 반환한다.
  • lastIndexOf(String s) : 호출 대상인 문자열이 가지는 내용 중 s와 일치하는 첫번째 인덱스를 반환한다. 일치하는 내용이 없다면 -1을 반환한다.
String str = "hello!"
System.out.println(str.indexOf("h"); //0
System.out.println(str.indexOf("l"); //2
  • length() : 호출 대상인 문자열의 길이를 반환한다.
String.length(); -> length는 비정적
  • matches(String p) : 호출 대상인 문자열의 내용이 정규표현식 p를 만족하는가의 여부를 반환한다.
  • repeat(int n) : 호출 대상인 문자열의 내용을 n번 반복한 새로운 문자열을 반환한다.
  • replace(CharSequence f, CharSequence t) : 호출 대상인 문자열이 가지고 있는 내용 중 f를 찾아 t로 치환한 새로운 문자열을 반환한다.
  • replaceAll(String r, String t) : 호출 대상인 문자열이 가지고 있는 내용 중 정규표현식 r을 만족하는 내용을 찾아 t로 치환한 새로운 문자열을 반환한다.
  • split(String p) : 호출 대상인 문자열이 가지는 내용에서 정규표현식 p를 기준으로 나눈 문자열 배열을 반환한다. (string 안넣고 사용해도 됨 - 배열에 스플릿 "" 하면 자르지 않고 모든 배열 다 가져오는..)
  • strip() : 호출 대상인 문자열의 내용에서 선후행 공백을 모두 제거한 새로운 문자열을 반환한다. trim()과 같음.
  • stripLeading() : 호출 대상인 문자열의 내용에서 선행 공백을 모두 제거한 새로운 문자열을 반환한다.
  • stripTrailing() : 호출 대상인 문자열의 내용에서 후행 공백을 모두 제거한 새로운 문자열을 반환한다.
  • substring(int f, int t) : 호출 대상인 문자열이 가지는 내용에서 인덱스가 f이상이고 t미만인 문자열을 반환한다. 인덱스는 0부터 시작된다.
  • toCharArray() : 호출 대상인 문자열이 가지는 내용을 문자 배열(char[])로 변환하여 반환한다.
  • toLowerCase() : 호출 대상인 문자열이 가지는 내용 중 모든 라틴 문자를 소문자화하여 반환한다.
  • toUpperCase() : 호출 대상인 문자열이 가지는 내용 중 모든 라틴 문자를 대문자화하여 반환한다.

Integer 클래스

  • Integer(java.lang.Integer)클래스는 일반 정수(int)와 관련된 편의 기능을 제공하고, 해당 타입 자체가 int타입의 리터럴로 작동할 수 있는 일반 정수(int)의 래퍼(Wrapper) 클래스이다.

정적 멤버 변수

  • MAX_VALUE : int 타입이 가질 수 있는 가장 큰 값
  • MIN_VALUE : int 타입이 가질 수 있는 가장 작은 값

정적 메서드

  • parseInt(String s) : 전달된 문자열 s를 일반 정수(int)로 변환하여 반환한다. 반환할 수 없는 문자열의 경우 NumberFormatException 예외가 발생한다.
  • parseInt(String s, int r) : 전달된 문자열 s를 r진법으로 인식하여 10진법으로 변환한 일반 정수(int)를 반환한다.
  • toBinaryString(int i) : 전달된 일반 정수(int) i를 2진법의 문자열로 변환하여 반환한다.
  • toHexString(int i) : 전달된 일반 정수(int) i를 16진법의 문자열로 변환하여 반환한다.
  • toOctalString(int i) : 전달된 일반 정수(int) i를 8진법의 문자열로 변환하여 반환한다.
  • toString(int i) : 전달된 일반 정수(int) i를 문자열로 변환하여 반환한다.

객체 메서드

  • byyeValue() : 호출 대상이 가진 일반 정수(int)값을 byte 타입으로 변환하여 반환한다. 오버/언더플로우가 발생할 수 있음.
  • shortValue() : 호출 대상이 가진 일반 정수(int)값을 short 타입으로 변환하여 반환한다. 오버/언더플로우가 발생할 수 있음.
  • intValue() : 호출 대상이 가진 일반 정수(int)값을 int 타입으로 반환한다.
  • longValue() : 호출 대상이 가진 일반 정수(int)값을 long 타입으로 변환하여 반환한다.
  • floatValue() : 호출 대상이 가진 일반 정수(int)값을 float 타입으로 변환하여 반환한다.
  • doubleValue() : 호출 대상이 가진 일반 정수(int)값을 double 타입으로 변환하여 반환한다.
  • toString() : 호출 대상이 가진 일반 정수(int)를 문자열로 변환하여 반환한다.

Long 클래스

  • Long (java.lang.Long) 클래스는 큰 정수(long)와 관련된 편의 기능을 제공하고, 해당 타입 자체가 long 타입의 리터럴로 작동할 수 있는 큰 정수(long)의 래퍼(Wrapper) 클래스이다.
  • Long 클래스가 가지는 실질적인 값은 long이지만, Long은 long과 달리 참조 타입임으로 null을 할당받을 수 있다.

정적 멤버 변수

  • MAX_VALUE : long 타입이 가질 수 잇는 가장 큰 값
  • MIN_VALUE : long 타입이 가질 수 있는 가장 작은 값

정적 메서드

  • perseLong(String s) : 전달된 문자열 s를 큰 정수(long)로 변환하여 반환한다. 변환할 수 없는 문자열일 경우 NumberFormatException 예외가 발생한다.
  • perseLong(String s, int r) : 전달된 문자열 s를 r진법으로 인식하여 10진법으로 변환한 큰 정수(long)를 반환한다.
  • toBinaryString(long n) : 전달된 큰 정수(long) n을 2진법의 문자열로 변환하여 반환한다.
  • toOctalString(long n) : 전달된 큰 정수(long) n을 8진법의 문자열로 변환하여 반환한다.
  • toHexString(long n) : 전달된 큰 정수(long) n을 16진법의 문자열로 변환하여 반환한다.
  • toString(long n) : 전달된 큰 정수(long) n을 문자열로 변환하여 반환한다.

객체 메서드

  • byteValue() : 호출 대상이 가진 큰 정수(long)값을 byte타입으로 변환하여 반환한다.
  • shortValue() : 호출 대상이 가진 큰 정수(long)값을 short타입으로 변환하여 반환한다.
  • intValue() : 호출 대상이 가진 큰 정수(long)값을 int타입으로 변환하여 반환한다.
  • longValue() : 호출 대상이 가진 큰 정수(long)값을 반환한다.
  • floatValue() : 호출 대상이 가진 큰 정수(long)값을 float타입으로 변환하여 반환한다.
  • doubleValue() : 호출 대상이 가진 큰 정수(long)값을 double타입으로 변환하여 반환한다.
  • toString() : 호출 대상이 가진 큰 정수(long)값을 문자열로 변환하여 반환한다.

Double 클래스

  • Double (java.lang.Double)클래스는 double타입과 관련된 편의 기능을 제공하고, 해당 타입 자체가 double타입의 리터럴로 작동할 수 있는 double의 래퍼(Wrapper)클래스이다.
  • Double클래스가 가지는 실질적인 값은 double이나, 이는 참조 타입임으로 null을 할당받을 수 있다.

정적 멤버 변수

  • MAX_VALUE : double 타입이 가질 수 있는 가장 큰 값
  • MIN_VALUE : double 타입이 가질 수 있는 가장 작은 값
  • NaN : 숫자가 아닌 값(Not a Number). 내부적으로 0.0 / 0.0 연산으로 구현되어 있다.
  • NEGATIVE_INFINITY : 음의 무한대. 내부적으로 -1.0 / 0.0 연산으로 구현되어 있다.
  • POSITIVE_INFINITY : 양의 무한대. 내부적으로 1.0 / 0.0 연산으로 구현되어 있다.

정적 메서드

  • isFinite(double d) : d가 유한한가의 여부를 반환한다. 양/음수를 구분하지 않는다.
public class Study1{
	public static void main(String[] args){
		System.out.println(Double.isFinite(17); //true
        System.out.println(Double.isFinite(-17); //true
	}
}
  • isInfinite(double d) : d가 무한한가의 여부를 반환한다. 양/음수를 구분하지 않는다.
  • isNaN(double d) : d가 Double.NaN인가의 여부를 반환한다. 어떠한 값이 NaN인가를 검사할때에는 절대로 동/부동(==, !=)연산을 사용하지 않는다.
public class Study1{
	public static void main(String[] args){
		System.out.println(0.0 / 0.0 == Double.NaN; //false
        System.out.println(0.0 / 0.0 == 0.0 / 0.0); //false
	}
}
  • parseDouble(String s) : 문자열 s를 double로 변환하여 반환한다. 변환할 수 없는 문자열일 경우 NumberFormatException 예외가 발생한다.
  • toString(double d) : d를 문자열로 변환하여 반환한다.

객체 메서드

  • byteValue() : 호출 대상이 가진 double값을 byte타입으로 변환하여 반환한다. 오버/언더플로우가 발생할 수 있음
  • shortValue() : 호출 대상이 가진 double값을 short타입으로 변환하여 반환한다. 오버/언더플로우가 발생할 수 있음
  • intValue() : 호출 대상이 가진 double값을 int타입으로 변환하여 반환한다. 오버/언더플로우가 발생할 수 있음
  • longValue() : 호출 대상이 가진 double값을 반환한다. 오버/언더플로우가 발생할 수 있음
  • floatValue() : 호출 대상이 가진 double값을 float타입으로 변환하여 반환한다. 오버/언더플로우가 발생할 수 있음
  • doubleValue() : 호출 대상이 가진 double값을 반환한다.
  • isInfinite() : 호출 대상이 가진 값이 무한한가의 여부를 반환한다.
  • isNaN() : 호출 대상이 가진 값이 NaN인가의 여부를 반환한다.
  • toString() : 호출 대상이 가진 값을 문자열로 변환하여 반환한다.
public class Study1{
	public static void main(String[] args){
    	Double d = 5.70;
        d.isInfinite();
	}
}

Math 클래스

  • Math (java.lang.Math)클래스는 수학과 관련된 편의 기능을 제공하는 유틸리티 클래스이다.
    ** 유틸리티 클래스는 객체화가 안됨 / 전부 static메서드와 상수로만 이루어져있기 때문

정적 멤버 변수

  • E : 자연 상수(e)
  • PI : 원주율(π)

정적 메서드

  • abs(int|long|float|double x) : 숫자 x의 절댓값을 반환한다.
public class Study1{
	public static void main(String[] args){
		System.out.println(Math.abs(-17)); //17
	}
}
  • absExact(int|long x) : 정수 x의 절댓값을 반환한다. 단, 오버플로우가 발생할 경우 ArithmeticException 예외가 발생한다.
    ** abs 쓸 때 오버플로우 일어나도 예외처리 안됨
public class Study1{
	public static void main(String[] args){
    	//int의 최대 : 2147483647 / 최소 : -2147483648
		System.out.println(Math.abs(-2147483648)); //오버플로우 발생 (오류 안터짐)
        -> 그래서 System.out.println(Math.absExact(-2147483648)); 를 씀
	}
}
  • pow(a, b) : 숫자 a의 b제곱(a의 b승)을 반환한다.
  • ceil(double x) : x의 소수부를 올림하여 반환한다.
  • floor(double x) : x의 소수부를 내림하여 반환한다.
  • round(double x) : x의 소수부를 반올림하여 반환한다.
  • max(int|long|double a, int|long|float|double b) : 숫자 a와 b중 더 큰 값을 반환한다.
  • min(int|long|double a, int|long|float|double b) : 숫자 a와 b중 더 작은 값을 반환한다.
public class Study1{
	public static void main(String[] args){
		System.out.println(Math.min(1, 2)); //1
	}
}
  • sqrt(double x) : 숫자 x의 제곱근을 반환한다.
  • cbrt(double x) : 숫자 x의 세제곱근을 반환한다.
public class Study1{
	public static void main(String[] args){
		System.out.println(Math.sq(58, 11)); //58
	}
}
  • log(double x) : 숫자 x의 자연 로그를 반환한다.
  • log10(double x) : 숫자 x의 상용 로그를 반환한다.
  • random() : 0 이상 1 미만의 실수를 반환한다.
  • addExact(int|long a. int|long b) : 정수 a와 b의 합을 반환한다. 단, 오버/언더플로우가 발생할 경우 ArithmeticException 예외가 발생한다.
  • multiplyExact(int|long a. int|long b) : 정수 a와 b의 곱을 반환한다. 단, 오버/언더플로우가 발생할 경우 ArithmeticException 예외가 발생한다.
  • multiplyFull(int a, int b) : 일반 정수(int) a와 b의 곱을 큰 정수로(long) 반환한다.
  • subtractExact(int|long a, int|long b) : 정수 a와 b의 차를 반환한다. 단, 오버/언더플로우가 발생할 경우 ArithmeticException 예외가 발생한다.
  • negateExact(int|long x) : 정수 x의 부호를 반전하여 반환한다. 단, 오버플로우가 발생할 경우 ArithmeticException 예외가 발생한다.
public class Study1{
	public static void main(String[] args){
		System.out.println(Math.negateExact(-2147483648)); //오류
	}
}
  • decrementExact(int|long x) : 정수 x에서 1을 뺀 값을 반환한다. 단, 언더플로우가 발생할 경우 ArithmeticException 예외가 발생한다.
  • incrementExact(int|long x) : 정수 x에 1을 더한 값을 반환한다. 단, 오버플로우가 발생할 경우 ArithmeticException 예외가 발생한다.
  • toIntEact(long x) : 큰 정수(long)인 x를 일반 정수(int)로 변환하여 반환한다. 단, 오버/언더플로우가 발생할 경우 ArithmeticException 예외가 발생한다.

예외

  • 일반적으로 말하는 예외(Exception)는 자바 프로그램이 실행되는 도중 우연의 여부를 가리지 않고 발생할 수 있는 오류를 의미한다. 단, 이러한 "예외"는 Throwable의 하위 타입임으로, 자바에서 발생할 수 있는 모든 오류는 사실상 Throwable임에 유의한다.

Throwable

  • Throwable (java.lang.Throwable) 클래스는 '던질 수 있는'이라는 의미로 자바 내에서 발생할 수 있는 일반적인 의미의 '오류'의 최상위 타입이다.
  • try-catch, throw 혹은 메서드의 throws 시그니처 대상이 되기 위해서는 직/간접적으로 Throwable 타입을 상속 받아야 한다.

Error

  • Error (java.lang.Error) 클래스는 Throwable을 상속 받아 자바 실행 중 발생할 수 있는 기기/환경 요인에 의한 오류를 구현한다.
  • 일반적으로 개발자의 실수로 인해 발생하는 문제를 구현하지 않는다. 주로 하드웨어의 메모리 부족이나 가상 환경(JVM)에 치명적인 오류가 있을 때 발생한다.
  • 개발자가 직접 Error 클래스를 상속 받아 사용자 정의의 Error를 만들거나, 고의로 발생시키는 것은 지양한다.
  • Error를 상속받는 대표적인 예:
    • OutOfMemoryError : 가상 머신에 할당된 메모리가 부족하여 발생
    • StackOveflowError : 스택 오버플로우로 인하여 발생
    • VirtualMachineError : 가상 환경(JVM)과 관련된 문제로 발생

Exception

  • Exception (java.lang.Exception) 클래스는 Throwable을 상속 받아 자바 실행 중 발생할 수 있는 일반적인 오류를 구현한다.
  • 예외는 크게 RuntimeException 클래스를 직/간접적으로 상속받는 것과, 그렇지 않은 것으로 나누어져 있다.
  • 사용자 정의의 오류가 필요하다면, Exception 혹은 RuntimeException을 상속받아 사용하는 것이 좋다.

RuntimeException을 상속 받지 않는 것

  • Checked Throwable로, 별도의 명시나 처리 없이 발생시킬 수 있다.
  • 대표적인 예
    • IOException
    • InterruptedException
    • TimeOutException

RuntimeException을 상속 받는 것

  • Unchecked Throwable로, 별도의 명시나 처리 없이 발생시킬 수 있다.
  • 대표적인 예
    • NullPointerException
    • ArrayIndexOutOfBoundsException
    • ArithmeticException
    • NumberFormatException

Throwable 예외 발생시키기

  • 고의로 Throwable을 던지기 위해 throw키워드를 활용한다.
throw [Throwable을 상속 받는 객체];
  • 가령 NumberFormatException을 고의로 발생시키기 위해 아래와 같이 작성할 수 있다.
throw new NumberFormatNumberFormatException();
  • 발생시키고자 하는 Throwable이 Checked Throwable이라면, 던지는 구문이 try-catch의 try구현부 내에 있거나, 메서드에 throws 시그니처에 존재하여야 한다.

try-catch

  • try-catch문은 try가 가지는 구현부 안에서 발생하는 오류에 대해 오류를 발생시키지 않고(JVM에 넘기지 않고) catch에서 원하는 로직을 실행하기 위해 사용한다.
  • try-catch문의 구조는 아래와 같다.
try{
	[구현부]
} catch ([처리 할 예외 선언]){
	[예외 발생시 실행할 구현부]
} finally {
	[최종 구현부]
}
->
public class Study1{
	public static void main(String[] args){
    	try{
    	String birth = "hello";
        int birthInt = Integer.parseInt(birth);
        Math.multiplyExact(birthInt, 20000);
        System.out.println("정상 실행");
        } catch (NumberFormatException e) {
        	System.out.println("NumberFormatException 터짐");
        } catch (ArithmeticException e) {
        	System.out.println("ArithmeticException 터짐");
        } finally{
        	System.out.println("끝");
        }
    }
}
  • 하나의 try는 여러개의 catch를 가질 수 있다.
  • 여러개의 catch를 사용할 때 각 catch는 동일한 타입의 예외를 가져서는 안되며, 선행하는 예외가 후행하는 예외보다 부모여서는 안된다.
  • catch 하는 예외가 Checked Trowable 일 경우 해당 예외를 던질 수 있는 가능성이 있는 로직이 try 내부에 구현되어 있어야 한다. (단, Exception은 예외)
  • finally문은 선택사항이며, 이가 가지는 구현부는 try문을 정상 실행(오류 없이) 하였든, 오류가 발생하여 catch문으로 빠졌든, 반드시 실행됨을 보장받는다. 모든 catch보다 아래에 있어야 하고, 한 개만 사용할 수 있다.
  • catch나 finally문에서 실행되는 구현부는 이가 포함되어 있는 try문에 의해 예외 처리 되지 않음에 유의한다.

메서드 예외 시그니처

  • 예외를 처리하기 위해 try-catch를 사용하지 않고 메서드에 throws 시그니처를 사용할 경우 발생하는 예외를 메서드 내부의 로직에서 처리하는 것이 아니라, 해당 메서드의 호출자에게 전가하여 예외를 대한 로직을 호출자가 처리하게끔 한다.
  • 예외 시그니처가 명시되어있는 메서드를 호출하는 호출자는 명시된 예외에 대한 적절한 처리 없이 해당 메서드를 호출할 수 없다.
[메서드 구조] throws [예외, ...]{
	[구현부]
}
  • 가령 HTTP 요청을 전송하고 응답을 받아오는 메서드를 작성하기 위해 HttpClient 타입의 객체가 가진 client메서드를 호출하여야 하는데, 해당 메서드는 IOException을 던질 수 있다는 시그니처가 있음으로 아래와 같이 적절한 처리를 해주어야 한다.
try{
	HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
    	.url(URI.create("https://api.ipify.org/?format=json"))
        .GET()
        .build();
    HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.body());
} catch (IOException e) {
	//IOException 처리 구현부
    System.out.println("통신 오류 발생");
} catch (InterruptedException e) {
	//InterruptedException 처리 구현부
	System.out.println("사용자가 작업을 취소하였습니다.");
}

'BACK-END > JAVA' 카테고리의 다른 글

JAVA | 20251120  (0) 2025.11.20
JAVA | 20251118 연산자  (0) 2025.11.19
JAVA | 20251117  (0) 2025.11.17
[자바] 계산기 과제 TIL  (0) 2025.04.23
[자바 프로그래밍 기초] 예외(Exception)와 예외처리 (try- catch)  (0) 2025.04.17