[JAVA] 정리

KDH59·2024년 2월 26일

[JAVA]

목록 보기
13/13

JAVA

📌 Java 란?

  • 객체 지향적 프로그래밍 언어 📖

📌 Java의 특징

  • 객체 지향 언어, 이식성이 높다, Open Souse 라이브러리가 풍부

  • 📖 객체 지향 언어란 ?
    객체(하나하나의 소스) 지향 프로그래밍 -> 남의 소스를 부품처럼 쉽 게 사용하기 위한 프로그래밍

📌 Java의 의의

  • " 남의 것을 사용하기 편하게' 라는 관점

📌 변수란? 📌

  • 데이터를 저장하는 메모리 공간
  • 변수를 특정한 공간에 담아둠으로써 데이터의 오염, 훼손, 유실 등을 막음
 String wineglass = "와인 한잔"
 ( 타입 )( 이름 ) = ( 변수 안의 값 )

📌 Scope 영역 📌

  • 변수는 선언된 곳 보다 바깥쪽 영역에서는 사용 불가능하다.

📌 Casting 📌

  • 보다 큰 타입으로 이동하는 것 = 절차가 필요 X , = 프로모션[묵시적 형변환]
  • 보다 작은 타입으로 이동하는 것 = 절차가 필요 O , = [명시적 형변환]
  • 다른 종류의 컵으로 이동 = [명시적 형변환]

  • 자료형의 최대 밸류 값과 최소 밸류값 찾는법
    MAX_VALUE, MIN_VALUE
 System.out.println(Byte.MIN_VALUE + "~"+Byte.MAX_VALUE);

Method

📌 Method 란?

  • Java에서 method는 코드 블록으로, 특정작업을 수행하는 기능이나 동작을 정의

📌 매소드의 구조

 반환타입() 매서드 이름() 매개변수() {
 실행문();
 반환문()
 }
  • 📖 method는 구성요소를 꼭 모두 가지고 잇는 것은 아니다.

  • 📖 Void 사용 하는 경우는 반환 타입이 없을때
  • 📖 용도에 따라 매게변수를 줄 수 있다. 리턴변수 값을 기억

연산자

  • 연사자에 붙는 항의 수에 따라 단 항, 이 항, 삼 항 연산자로 분류

📌 단 항 연산자

  • 부호에 붙는 피 연산자가 하나인 경우를 단 항 연산자로 함

📌 단 항 연산자 종류

  • 부호( +,- ), 증감( ++,-- ), 논리부정( ! ), 비트 반전 ( ~ )
    📖
    x++; : 증가 나중에 - 카운트에 주로 활용
    ++y; : 증가 먼저 - 증가한 내용을 이용해 다른 행동을 진행할떄 활용

📌 이 항 연산자

  • 부호에 붙는 피 연산자가 두개인 경우를 이 항 연산자로 함

📌 이 항 연산자 종류

  • 사칙연산 및 나머지 연산이 있다.

📌 이 항 연산자 특징

  • 이 항 연산에서는 문자열도 더할 수 있다.
  • 첫 값이 문자일 경우 문자로, 숫자일 경우 숫자로 인식 된다.
  • 문자가 발견되는 시접점 부터는 더하기(PLUS) 가 아닌 추가(ADD)가 된다.
String str1 = "JDK"+8+0.65;

System.out.println(str1); = "JDK80.65";

String str2 = 8+0.65+"JDK";

System.out.println(str2); = 8.65JDK

String str3 = "8"+0.65+"JDk";

System.out.println(str3); = 80.65JDK
  • 📖 비교 연산은 항상 왼쪽을 기준으로 한다.

📌

  • ( = ) 은 대입 연산으로 사용
  • 문자열은 여러 방법으로 선언 가능
String v4 = "JAVA", String V5 = new String("JAVA")

📌 비교 연산

System.out.println(v1 == v2);
System.out.println(v1 != v2);
System.out.println(v1 < v3);
System.out.println(v4 == v5);
System.out.println(v4.equals(v5));

  • 📖 문자열 비교는 반드시 equals로 비교하기

📌 And / Or 조건

  • AND 와 OR 조건은 선택 영역의 교집합과 합집합을 의미한다.

📌 복합 대입 연산자

📌 삼 항 연산자

  • 조건이 true 면 A, false 면 B 값이 대입 된다.

char grade = (score > 90) ? 'A' : (score > 80) ? 'B' : 'C';
  • 📖

📌 %,++,--,!,||,&& 숙지

나머지 %, [두 개 항을 나눈 나머지]

증가 ++,

감소, --,

논리부정 !, [해당 boolean 값을 반전]

동등비교 ==, [A 와 B 가 같은지 검사]

AND ||, [A와 B 둘 다 TRUE인 경우 TRUE]

OR && [A와 B 둘 중 하나만 TRUE 이면 TRUE]

조건문

📌 조건문이란?

  • 프로그램의 흐름을 제어하고 특정 조건에 따라 코드 블록을 실행하도록 하는 제어 구조

📌 IF 문 [ 만약에 ]

  • 만약에 어떤 상황(조건)이 일어났을 경우(true) 특정 내용을 실행
  • IF 안의 조건이 반드시 True 가 되어야 됨

📌 IF ~ else 문

  • IF 안의 조건을 만족 시키지 못할 경우 활용

📌 IF, IF ~ else 의 차이점

  • IF 단순한 조건을 검사하고 해당 조건이 참일 경우에만 특정 블럭을 실행
  • IF ~ else문은 조건이 참과 거짓일떄 각각 다른 블록을 실행

  • 📖 IF 문만 사용 할 경우 경계선값 오류가 발생 할 수 있기에
    IF - esle 문을 활용

📌 else if

  • 여러 경우를 사용할때 사용?

📌 Switch문

  • 특정 Case 마다 특정 내용을 실행

📌 Switch문 특징

  • 다른 선택 사항으로 활용 할 수 있다.
  • 조건을 다루지 않아 한계가 있다. 다만 속도가 빠름
  • case 문에서는 특정 case 위치로 이동시켜 주지만 코드블럭 끝까지 실행
    그래서 특정 케이스 실행 이후에 Break 을 통해 해당 코드 블럭을 끝내야 한다.

  • 📖 코드가 시작하면 마지막까지 프로그래밍 된다.

반복문

📌 반복문이란? 📌

  • 단순한 일을 반복할떄 사용
  • 자동화를 위해 가장 중요한 조건
  • 특정한 조건이 만족되어야 한다.

📌 반복문의 종류

  • For 문
  • While 문
  • do while 문

📌 For 문 정의

  • 횟수가 정해져 잇는 반복적인 작업을 수행하기 위해 사용되는 제어구조

📌 For 문 실행문

📌 While 문 정의

  • For 문과 다르게 조건이 참이면 무한 반복

📌 While 문 실행문

  • For 문과 다른 구조

  • 📖 무한루프에 빠지는 것을 지칭하는 오류코드는 Unreachable code이다.

  • 📖 해결 방안으로는 : 무한루프 코드 아래 부분은 삭제하거나 while문이 멈출 수 있는 방법 ( braak 등 ) 을 마련해준다.

📌 Do while 문 정의

  • Do 내용을 먼저 실행한 뒤 while 문의 지속 여부를 체크하는 방식

📌 Do while 문 실행문

  • 📖 조건이 부합할 경우 while문과 do while 문은 동일하게 작동
    단, 조건이 부합하지 않을 경우 다른 결과를 낸다

📌 Break 문

  • 특별한 경우 영역 안의 내용을 모두 실행하지 않고 빠져 나올때 사용
    Ex) Swicth 문의 case가 있다.

📌 Continue 문

  • 특별한 경우 영역 안의 내용을 무시하고 지나칠 때 사용하는 문

Array 배열

📌 배열이란 📌

  • 여러개의 변수를 하나에 담는 기능을 가지고 있다.
  • 변수를 일렬로 세워놓고 각 상자에 번호를 붙여 놓은 형태
  • 배열은 0번부터 시작 [ 0을 기준으로 삼기 때문 ]

📌 배열의 특징

  • 공간이 확보 되어 있어야 하며 선언 시 미리 크기를 지정해야됨
  • 배열 선언 시 []가 들어 가야된다 ex) String [] arr = {}

📌 배열 선언 방법

  • 선언과 동시에 값을 넣는 방식
  • new 연산자로 값을 추가하는 방식
  • new 연산자로 바로 선언하는 방법

📌 배열 값 불러오기

  • 배열은 기준 변수로부터 얼마나 떨어졌는지가 이름이 된다.
  • 값을 넣거나 부를 때 이 이름을 사용
  • length 속성은 해당 배열의 길이 값을 가지고 있다.

📌 다차원 배열

  • 다차원 배열의 개념을 아파트와 방의 개념으로 생각 해보자
1차원 : royal[1] = ROYAL 아파트 1호
2차원 : royal[1][2] = ROYAL 아파트 1층 2호
3차원 : royal[1][2][0] = ROYAL 아파트 1층 2호 0번 방

📌 향상된 For 문

  • 향상된 for문은 코드를 간결하게 작성할 수 있고. 반복문의 오류 가능성을 낮추어주며 개발자의 편의를 증진
  • 주로 반복문에서 요소의 인덱스를 다룰 필요가 없는 경우에 사용되며, 코드를 더 간결하고 가독성 있게 만들어 준다.

Class

📌 Class 란?

  • 각종 method 와 변수 등을 담는 분류이다.
  • Class의 이름은 어떤 변수와 함수의 종류를 대변하는 이름

📌 Package 란?

  • Class를 종류 별로 담아 놓은 폴더

📌 Class 의 특징

  • OOP 4대 특성
    • 캡슐화 (Encapsulation)
    • 상속 (Inheritance)
    • 추상화 (Abstractionism)
    • 다형성 (Polymorphism)

📌 Class 선언

  • Java의 파일은 최소 1개 이상의 Class 를 가지고 있어야 함
  • Class를 만드는데 몇 가지 규칙이 있다. / 첫 글자는 대문자로 하다.
class 는 파스칼 표기법을 사용 한다.
 - 모든 단어의 첫 문자가 대문자이고 나머지는 소문자로 표기한다 (Blackcolor)

그 외에는 카멜표기법을 사용 한다.
 - 최초의 사용 된 단어외에 의미를 갖는 단어의 첫글자만 대문자로 표기(blackColor)

스네이크 표기법 
 - 대소문자 구분이 없는 언어에서 주로 사용(black_color)

📌 Class 의 Main Method 란?

  • Main Method가 있는 Class는 스스로 동작할 수 있다.
  • Main Method가 없는 Class는 누군가를 불러서 사용 해야 된다 [ 스스로 동작 X ]

📌 Class의 객체(instance)화

  • 객체화란? 원본 Class를 복사해 오는 것

📌 Exsample sample = new Exsample

  • 같은 원본에서 복사해서 가져와도 일련번호가 다르기 때문에 같다고 볼 수 없다.
  • 같은 원본에서 복사해도 각각 다른 복사본 이기에...
  • 📖 String 끼리 [==] 대조 한다면 일련번호를 대조하기 때문에 다르다고 판단 할 수 있다.
  • 📖 이때는 Equals()를 통해 일련번호가 아닌 내용으로 대조 하도록 한다.

📖 라이브러리 ( 도서관 ) : 누군가가 만들어 놓은 수많은 방법론(method) 들을 도서관 처럼 모아 놓은 공간

📌 API (APPlication Programming Interface)

  • 응용 프로그렘에서 사용할 수 있도록, 운영체제나 프로그래밍 언어가 제공하는 기능을 제어 할 수 있게 만든 Interface

📌 Interface 란?

  • 실제로 하면 복잡한 일을 간단하게 할 수 있도록 만들어 놓은 어떤 장치
    Ex) 전구를 켤 떄 전구에 전선을 직접 연결하지 않고 " 스위치 " 사용

📌 Java API

  • 어떤 일을 수행 하기 위해 사용하는 도구나 방법(Method) 추가로 사용법도 포함 하고 있다.

📌 Member 구성

  • Menber 에는 constuctor(생성자),fild(변수),mrthod(매서드)로 구성되어 있다.

📌 생성자(constructor)는 class를 객체화(instance)해준다.

  • 클래스의 이름과 같으며 매서드의 위치를 갖는다.
  • ExSample sample = new Exsample(); -> 기본 생성자
    📖 생성자는 클래스를 객체화 하면 대체해주는 역할을 갖게 된다.
    📖 생성자는 class가 istance(객체화)되면서 가장 먼저 실행된다.

📌 객체화 순서

  • 객체화 요청 -> 생성자 호출 -> 객체화

📌 생성자의 초기화

  • 생성자는 객체화 될 때 '초기화'하는 수단으로 활용 된다.
  • 초기화는 '0'을 만드는 것이 아니고 최초의 값을 주는 것이다.

Overroad

※ JAVA는 매소드랑 생성자는 여러개 생성 할 수 있도록 허용해줌

  • 같은 이름으로 여러개의 생성자를 만드는 것을 'overload'라 한다, 단 매개 변수의 갯수나 형태가 달라야 한다.
public Puppy(String name, String goal) <- OK
public Puppy(String name) <- OK 매개변수 하나만 있으므로 가능
public Puppy(String goal) <- NO 같은 타입의 매개변수가 1개 있음으로 불가능 (위 타입과 생성자 이름 100%일치)
public Puppy() <- OK 기본생성자

📌 Overload 사용 이유

  • 이유 : 다양한 객체화를 지원하기 위해서 [ 누군가는 초기화를 하고 싶지 않을수도, 이름만 넣고 싶을 수 있으니]
  • 이유 : 다양한 객체화가 되지 않으면 해당 매개변수를 사용하는 매서드를 일일히 찾아야 되기 떄문

📌 Method overload

  • method 역시 overload이 가능하다.

📌 Method overload 필요 이유

  • 사용자 입장에서는 매개변수를 넣으면 해당 매서드로 자동 연결 -> 오버로드가 없으면 해당 매개변수를 사용하는 매서드를 일일히 찾아야됨

Static

  • 원본 영역에 저장되어 존재 -> 객체화 해서 복사가 안된다.

📌 Static 활용법

  • 하나의 내용을 공지하거나 원본을 다른 사람이 회손 시키면 안되는 데이터가 있을 시

📌 Final keyword

  • final 은 한번 지정 되면 프로그램 종료 시 까지 변경이 불가능 하다 [ 읽기 전용 ]
    - final 은 생성자에서만 초기화 가능하다.

📌 Static final == Constant(상수)

  • Static final 의 경우 객체화 초기화가 되지 않아 불변의 값으로 간주된다.
  • 이러한 필드를 Constant(상수)라고하며 모두 대문자 표기
  • 상수는 소스단에서 입력되고 나서 프로그램에서는 절대로 바뀌어서는 안되는 값에 사용

📖 static final 초기화 방법

  • static final는 반드시 선언과 동시에 초기화시키거나 정적 블록 내에서 초기화
  • 모든 상수는 -> utility로 지칭

📌 접근제한자

  • 남들이 사용 가능한 코드도 있지만 내부적으로만 사용할 코드가 있을경우 접근제한자를 사용
    [ JAVA 에서는 접근을 허용 하거나 제한 할 수 있기 떄문 ]
Public -> + 전체 사용 가능
protected -> # 사용 제한
default -> ~ 패키지 내 사용 가능
private -> - 클래스 내 사용 가능
 

📖 private의 외부 사용 방법

  • JAVA 에서 제공하는 getter,setter를 사용한다. (Alt + shift + s)
  • [ 개발자가 사용자의 실수를 막기 위해 접근 제한자로 접근을 막아 주는 것을 캡슐화라고 함]

캡슐화 (Encapsulation)

  • 이렇게 특정 부분의 접근을 제한하는 것을 캡슐화(Encapsulation)이라고 한다

상속 (Inheritance)

  • 정의 : 한 클래스가 다른 클래스의 특성과 동작을 그대로 물려받아 사용할 수 있는 기능
  • Ex) 나에게 없는 것을 부모에게 물려 받아 원래 내것처럼 사용하는 것
  • 넓의 정의 : 일반화

📌 상속을 하는 이유

  • code의 중복을 피할 수 없거나, 내 능력으로 만들지 못하는 기술이 있을떄
  • Ex) 누군가 만들어 놓은 코드를 부품처럼 쓴다는 개념
    📖 단, 공개적(Pubilc)으로 상속해 주겠다는 것만 사용 가능
    📖 inheritance(상속) 이 아닌 extends(확장)이라는 키워드를 사용

📌 상속의 개념

  • 자바는 다중 상속을 허용하지 않음 -> 자바 클래스 분류의 개념으로 정의에서 어긋남
  • Ex) 인간이 조류의 특성과 포유류의 특성을 동시에 상속 받을 수 없는 이유

📌 상속의 특징

  • class를 상속 받으면 해당 method를 부모 class 호출 없이 사용 가능
  • 나를 객체화시키면 부모를 객체화시키지 않아도 사용 할 수 있다.
  • 상속을 받으면 부모의 기능을 내것처럼 쓸 수 있다
객체화로도 남의 기능을 쓸수는 있다.
또한 UML에서는 상속(inherritance)을 일반화(generraliztion) 라고 표현한다.

📌 객체화랑 상속의 차이점

  • 객체화 사용 시 각 클래스에 어떠한 매소드가 있는지 일일히 확인 필요
  • 상속을 사용 시 한 클래스씩 객체화 하지 않아도 한 클래스에 몰아넣어서 사용 가능

📌 Override

  • 정의 : 상속 받은 매서드를 다른 매서드로 바꿔 덮어쓰인다.
    📖 전체 또는 일부분만 바꿀 수 있다.
@Override // 전체
public int run() {
return 200;
}
boolean turbo = false;
@Override // 일부분
public int run() { // 상황에 따라서 부모 메서드를 일부 사용
if(turbo) {
return 200;
}else {
return super.run() 
// ※ super 는 부모를 의미 super class 는 부모클래스를 의미 = 상위 클래스

📌 Final 붙은 매서드

  • Override는 기존 매서드를 수정하는 작업이기에 Final [읽기전용] 붙으면 사용 할 수 없다

다형성 (Polymorphim)

  • 개념 : 같은 부모를 상속 받은 class는 같은 Type으로 들어 갈 수 있다.

📌 다형성 필요

  • 사용할 객체가 여러개라면 여러개의 객체를 담을 변수르 일일히 선언해야 하기 떄문

📌 다형성의 유용

  • 여러 객체가 필요할 때 부모 형태의 변수 하나만 선언하여 사용 할 수 있기에
    [ 자원적으로 훨씬 유용하기 때문]
    - 단, 자식 객체의 고유 특성이 사라진다는 단점이 있다.

📌 다형성의 형변환

  • 묵시적 형 변환 - 자식 클래스가 부모 클래스로 들어가는 것
  • 묵시적 형 변환 단점 : 부모 형태로 들어간다는 것은 고유특성이 사라진다.
    [ 고유특성을 발현할려면 다시 나가야됨 ]
  • 명시적 형 반환 - 부모형태에서 자식 형태로 되돌아 올때 사용

📖 변수와 매개변수의 차이점

  • 변수는 데이터를 저장하는 메모리 공간의 이름으로서 어디서든 선언될수 있고, 해당 Scope 내에서 사용 됨
  • 매개변수는 매서드나 생성자와 같은 매서드의 파라미터로 사용, 매서드 호출 시 값을 전달 받음, 매서드 내에서만 유효하며 매서드 실행 종료시 소멸

📌 다형성의 활용

  • 필드 다형성을 활용하면 객체 변경시에도 필드 타입에 변화를 주지 않아도 된다.

  • 부가적인 장점 : 하나의 타입에 여러 객체를 관리할 수 있다는 것은 arrat의 활용이 가능해진다.

  • 필드 다형성을 활용하면 객체화 된 속성만 바꿔서 형변환 하면 된다.

    📖 변수에 쓰면 필드 다형성
    📖 매개변수에 쓰면 매개변수 다형성 : 매개변수를 부모 객체 형태로 하여 들어오는 변수의 폭을 넓힐 수 있다.

OOP 4대 특성

  1. 캡슐화 - 다른 사용자의 데이터 입/출력을 제한
  2. 상속 - 한 클래스가 다른 클래스의 특성과 동작을 그대로 물려받아 사용할 수 있는 기능
  3. 다형성 - 같은 부모를 상속 받은 class는 같은 Type으로 들어 갈 수 있다.
  4. 추상화 - ?

추상화

  • 개념 : 추상은 실체 간에 '공통되는 특성을 추출'히고 불필요한 정보를 제거해 '단순화'시키는 것

📌 추상

  • 규격을 잡다. 불필요한 정보는 제거 단순화

📌 추상화의 목적

  • 보다 정보를 확실하게 전달하기 위해
    - ★ 공통 또는 규격을 정하기 위해 ★

📌 추상화의 키워드

  • abstract 키워드 사용

📌 추상클래스의 특징

  1. 자식 외엔 객체화 할 수 없다.
  2. 추상 매서드가 있다.
  3. 추상 클래스를 상속 받으면 추상 매서드를 강제로 override 하게 된다.

📖 추상매서드란?

  • "형태만 있고 몸체는 없는" 매서드
  • 특정한 매서드를 강제로 override 해야 할 경우 설정

Interface

  • 내가 실제로하면 복잡한 일을 간단하게 실행 할 수 있도록 하는 기능
  • 추상 매서드를 통해 공통 작업 시 규격을 잡아 주는 역할
  • 추상 클래스의 interface는 상속(Extends)이 아닌 구현(implements)라고 불린다.

📌 Interface의 특징

  1. 복수개의 구현이 가능
  2. 다형성 활용 가능
    • class 의 다형성 : 상속받은 클래스가 부모 클래스 형태로 들어가는것
    • interface 의 다형성 : 구현 받은 클래스가 인터페이스 형태로 들어가는 것
  3. 객체화 불가능
    • 규격이 있지만 실체화는 없어 interface를 활용해주는 class가 필요
      [ interface는 규격의 개념이기에..]

📌 추상클래스와 인터페이스의 차이점

📌 Interface의 사용

  • interface의 구현[inplements] 키워드를 활용하여 다중구현이 가능
    - 규격이라는 것은 필요한 만큼 가져다 사용 할 수 있다.
  • interface를 통해서도 특정 기능 사용에 대한 규격을 설정 할 수 있다.

📖 Interface의 상속과 class의 상속 차이점 📖

  1. class는 단일 상속
    interface는 다중 상속

  1. class 다형성은 상속을 통해 구현 부모 클래스 타입으로 자식 클래스의 객체를 다룸
    interface는 다형성이 강조된다. 여러 클래스가 동일한 인터페이스를 구현하여 동일한 매서드를 제공

  1. class는 추상 클래스를 통해 일부 매서드의 구현을 강제한다
    interface는 모든 매서드가 추상이므로, interface를 구현하는 class는 모든 매서드를 반드시 구현

📖 class와 다르게 interface는 모듈구조를 갖기 때문에 복수개의 interface를 구현 및 상속이 가능하다.

Interface - 익명 객체 -

  • 클래스를 따로 정의하지 않고 익명 객체 내에서 즉석으로 직접 구현
  • 단, 익명 객체로 interface를 구현 받은 클래스는 다른 곳에서 불러서 사용 불가

📌 익명 객체 사용 이유

  • 익명 객체를 사용하는 경우에는 클래스를 따로 정의하지 않고 익명 객체 내에서 즉석으로 직접 구현이 가능하다는 장점이 있다.

Interface의 결합/응집도

📌 Interface 와 abstract class의 사용이유

  1. interface 와 추상화는 개발 시 전체적인 규격을 만들어준다.
  2. 활용하면 모듈 간의 결합도를 감소(느슨하고, 데미지를 적게 입는다)시킨다.
  3. 응집도는 높을 수록 좋으며, 결합도는 낮을 수록 좋다.
  4. 결합도가 낮은 것들의 공통점 : 규격이 있어야 한다.
  5. 결합도가 높으면 안 좋다 : 무언가를 수정 변경 교체시 어려움
    • Ex) 결합도가 제일 높은 거는 사람의 신체 부위가 제일 높음

📖 interface를 사용하면 결합도를 낮출 수 있다 / 규격이 있다면 서로 다른 것들끼리 충돌 없이 사용 가능하다

String & Exception

📌 String [ 문자열 ]

  • 프로그레밍에서 문자열을 다루는 것은 byte 와 char
  • 본래 String(문자열)은 char의 배열(array)을 내장하고 있다. / 정직 데이터 타입이 아님
  • 자바에서는 문자열을 다루기 위한 String 이라는 class를 만들게 한다

📌 String의 사용법

  • String은 class이기 때문에 여러가지 기능들이 있다
  • 문자열의 공백을 없애거나, 다른 문자로 치환 할 수 있따.
  • 또한 string이 char[]와 같다는 점에 착안하여 배열 개념을 이용한 기능들도 있다.

StringBuffer 와 StringBuilder

  • Strinh 은 용량이 고정되기 때문에 문자열 추가 시 객체를 계속 생성한다
    -> 이러한 무분별한 객체의 남발을 방지하기 위해서 사용

📌 StringBuffer

profile
[JAVA]

0개의 댓글