1. 데이터 타입 분류
그림에서 기본타입 변수는 값 그대로 Stack 영역에 저장이 되고, 참조타입 변수는 메모리의 번지(주소)를 저장합니다. 결국 Heap 메모리 영역을 참조해서 값을 출력해주는 것이지요. 주소를 통해 ‘참조’ 한다는 자료형이라 하여, 참조 자료형이라 부릅니다. 코드에서 사용된 String(문자열) 변수 또한 참조 자료형
변수 라고 합니다.
2. 메모리 사용영역
public class Main {
public static int s = 10;
public static void main(String[] args) {
int a = 5;
int b = 5;
int result1 = a + b + Main.s;
System.out.println(result1); // 20
Counter sub = new Counter();
twice(sub);
int result2 = sub.get();
System.out.println(result2); // 100
}
public static void twice(Counter c) {
c.plus(10);
c.plus(20);
}
}
class Counter {
public int state = 50;
public final int count = 20;
public int get() {
return state + count;
}
public void plus(int n) {
state += n;
}
}
- Heap 영역 : 객체 혹은 배열이 생성되는 영역
- 힙 영역의 객체 / 배열은 JVM 스택 영역의 변수나 다른 객체들에 의해 참조한다
- 만약 참조하는 변수가 없다면 의미없는 객체가 되면서 쓰레기로 취급
- JVM은 Garbage Collector을 실행시켜 쓰레기 객체를 힙 영역에서 자동으로 제거
- Stack 영역 :
- 기본 자료형, 지역변수, 매개변수가 저장되는 메모리 영역
- 참조 자료형의 경우 Heap 영역에 생성된 데이터의 참조값이 stack영역에 할당된다
- 메소드를 호출할 때마다 처리해야할 작업(Frame)을 추가(push) 하고 메소드가 종료되면 해당 Frame을 제거(pop)하는 동작을 수행
- Static(Method 영역) :
- 코드에서 사용되는 클래스(.class)들을 Class Loader로 읽어서, 클래스별로 런타임 상수풀(runtime constant pool), 필드(field) 데이터, 메소드(method)데이터, 메소드 코드 ,생성자(Constructor)코드 등을 분류해서 저장
- JVM이 시작할 때 생성되고, 모든 스레드가 공유하는 영역
3. 참조 변수의 ==,!= 연산
- 참조 변수들간의 ==,!=연산은 동일한 객체를 참조하는지를 알아볼 때 사용
- 참조 변수 : 주솟값을 저장
- String의 동등 비교
- 대소 비교를 할 수 없고, 동등 비교만 가능하다.
- 문자열(String) 이 같은지를 비교할때는 .equals()를 사용해야 한다.
- ==은 주솟값을 비교하기 때문
- 자바는 문자열이 동일하다면 동일한 String 객체를 참조한다.
//str1 과 str2는 동일 String str1 = "Hello"; String str2 = "Hello"; // str3는 new 로 생성한 새로운 String 객체이므로 새로운 주소를 가진다. String str3 = new String("Hello"); System.out.println(str1 == str2); // true System.out.println(str1 == str3); // false
4. NULL NPE
- Null :
- 참조타입 변수는
힙 영역의 객체를 참조하지 않는다
는 뜻으로 null 값을 가질 수 있다.
- Null 도 초기화 값으로 사용할 수 있기 때문에 null로 초기화된 참조변수는 stack 영역에 생성된다.
- 참조타입 변수는
- NPE(Null Pointer Exception) : 빈(null) 값을 접근하려 할 때 발생하는 오류
- 예외(Exception) : 프로그램 실행 도중 발생하는 오류
- NPE : 참조 자료형 변수를 잘못 사용한 경우 발생
- 참조할 객체가 없으면 발생하는 오류
int[] intArray = null; //참조할 배열(객체)가 없으므로 NPE 발생 intArray[0] = 10;
- str 값을 null이 아닌 “”로 초기화 하면 NullPointereException을 피할 수 있다.
5. 문자열(String)타입
- 문자열을 표현할 때 가급적이면 리터럴 표기방식을 사용하는것이 좋다.
- 가독성이 좋고, 컴파일시 최적화에 도움을 준다.
// 리터럴 표기 방식 String a = "123"; String b = "Hello World"; String c = "s"; //new 키워드로 객체를 만드는 방식 String a = new String("123"); String b = new String("Hello World"); String c = new String("s");
- 내장 메소드
- equals() : 문자열 2개가 같은지 비교해 결과값을 리턴
String a = "hello"; String b = new String("hello"); System.out.println(a.equals(b)); // true System.out.println(a == b); // false
- IndexOf() : 특정 문자열이 시작되는 위치(인덱스 값)을 리턴
String a = "Hello World!"; System.out.println(a.indexOf("!"));
- contains() : 문자열에서 특정 문자열이 포함되어 있는지 여부를 리턴
String a = "Hello World!"; System.out.println(a.contains("World"));
- charAt() : 문자열에서 특정 위치(인덱스)의 문자를 리턴
String findChar = "What is your hobby"; System.out.println(findChar.charAt(5));
- replaceAll() : 문자열에서 특정 문자열을 다른 문자열로 바꿀 때 사용
String a = "Hello World!"; System.out.println(a.replaceAll("World", "Spring"));
- substring(시작위치, 끝 위치) : 문자열에서 특정 문자열을 뽑아낼 때 사용
- 끝위치의 문자는 포함되지 않는다.
String a = "Hello World!"; System.out.println(a.substring(3, 5));
- toUpperCase() : 문자열을 모두 대문자로 변경
- toLowerCase() : 문자열을 모두 소문자로 변경
String a = "Hello World!"; System.out.println(a.toUpperCase()); System.out.println(a.toLowerCase());
- split() : 문자열을 특정한 구분자로 나누어 문자열 배열로 반환
String a = "a:b:c:d"; String[] result = a.split(":"); // result는 {"a", "b", "c", "d"}
- concat() : 문자열을 합쳐서 문자열로 반환
String result = "Hello"; System.out.println(result.concat("!")); // 결과 : Hello!
- format() : 문자열 포맷팅 메소드
- Stringblock : “”” “”” 사이에 형식을 넣어 여러줄을 한번에 출력하는 방식
String.format("... %s.. %s..", 치환값1, 치환값2); String name1 = "Tim"; int age1 = 30; String name2 = "Anna"; int age2 = 45; """ %s의 나이는 %s세 입니다 %s의 나이는 %s세 입니다 """.formatted(name1,age1,name2,age2)
- equals() : 문자열 2개가 같은지 비교해 결과값을 리턴
- StringBuffer / StringBuilder
public class StringBuilderBufferExample { public static void main(String[] args) { String result = ""; result += "Hello "; result += "Java "; result += "World!"; System.out.println(result); StringBuilder builder = new StringBuilder(); builder.append("Hello "); builder.append("Java "); builder.append("World!"); System.out.println(builder.toString()); StringBuffer buffer = new StringBuffer(); buffer.append("Hello "); buffer.append("Java "); buffer.append("World!"); System.out.println(buffer.toString()); } }
- 문자열을 추가하거나 변경할 때(연산) 주로 사용하는 자료형
- String도 + 나 concat()메소드로 문자열을 붙일 수 있다.
- 하지만 이런 방식들은 새로운 객체를 생성하고 String 공간을 할당하기 때문에 공간의 낭비, 속도도 비효율적
- 따라서 문자열 연산이 필요할 때는 StringBuffer / StringBuilder을 사용
- StringBuffer는 멀티스레드 환경에서 thread safe 하다는 장점이 있고, StringBuilder는 성능이 우수하다는 장점이 있다.
- 사용 메소드
- append() : 문자열을 생성(추가)하는 메서드
StringBuffer buffer = new StringBuffer(); buffer.append("Hello "); buffer.append("Java "); buffer.append("World!"); System.out.println(buffer); // "Hello Java World!" 출력
- insert() : 특정 위치에 원하는 문자열을 삽입 가능
StringBuffer buffer = new StringBuffer(); buffer.append("Hello"); buffer.insert(0, "World"); System.out.println(buffer);
- substring() : String자료형의 subString과 동일
StringBuffer buffer = new StringBuffer(); buffer.append("Hello "); buffer.append("Java "); buffer.append("World!"); System.out.println(buffer.substring(6)); // Java World! System.out.println(buffer.substring(6, 7)); // J
- append() : 문자열을 생성(추가)하는 메서드
6. 배열 타입
설명보기
- 자료형 바로 뒤, 혹은 변수명 뒤에 [](대괄호)기호를 붙인다.
- 선언 및 초기화
- 배열의 크기(길이)를 먼저 설정한 뒤, 배열 변수를 생성하고 그 값을 나중에 대입하는 방법
- 초기값 없이 배열 변수를 만들 때에는 7과 같은 숫자값을 넣어 길이를 정해줘야 한다.
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}; String[] weeks = new String[7]; // 배열의 크기를 7로 먼저 설정하여 배열 변수 생성 weeks[0] = "월"; // 각 인덱스에 해당하는 값 대입 weeks[1] = "화"; weeks[2] = "수"; weeks[3] = "목"; weeks[4] = "금"; weeks[5] = "토"; weeks[6] = "일";
- 배열의 길이 : .length
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}; for (int i = 0; i < weeks.length; i++) { System.out.println(weeks[i]); }
7. Daily Quiz
'Dev > ESTsoft 오르미' 카테고리의 다른 글
상속 (0) | 2024.02.23 |
---|---|
클래스 (0) | 2024.02.23 |
연산자 / 조건문과 반복문 (0) | 2024.02.22 |
변수 (0) | 2024.02.22 |
Java 기초 (0) | 2024.02.22 |