본문 바로가기

반응형

Programming/Java

(22)
[Java] String이 불변(Immutable) 객체인 이유 String 객체의 불변성(Immutability) String 객체는 불변성(Immutability)을 가진다. String 객체가 한 번 생성되면 생성된 값은 변하지 않는다. 아래 코드는 doraemon 이라는 String 객체를 생성한 후, 해당 객체에 다른 값을 할당했다. 처음 생성된 String 객체의 값 "aaa"가 "bbb"로 변경되었으니 doraemon 객체의 값은 "bbb"라고 생각할 수 있지만, 틀렸다. String 객체의 값이 변경된것이 아닌 새로운 String 객체가 생성되어 그 참조가 doraemon 변수에 할당된 것이다. String doraemon = "aaa"; doraemon = "bbb"; 처음 생성한 "aaa"와 이후 새롭게 생성된 "bbb" 두 개의 인스턴스가 Heap..
[Java] Spring Pool String Pool String Pool은 JVM에서 관리되는 String 저장 전용 메모리 영역이다. String은 불변성(immutability)을 가지기 때문에 String Pool에 오직 하나의 문자열만 저장되는데, 이 과정을 interning이라고 한다.(interning은 '내부에 추가하다'의 의미를 가지는 것 같다.) String 변수를 생성하고 원하는 값으로 초기화 후 해당 변수를 다시 호출하면 JVM에서 String Pool에 해당 String 변수와 동일한 값이 있는지 검색한다. 동일한 값이 있으면 추가로 메모리를 할당할 필요가 없다. 기존에 String Pool에 저장된 메모리 주소를 참조(reference)하면 되기 때문이다. 동일한 값이 없으면 String Pool에 메모리를 추..
[Java] 자바 스트림(stream) Java8에 추가된 stream은 연속된 정보를 처리하는데 사용된다. 여기서 '연속된 정보'라는 것은 주로 컬렉션을 말한다. stream은 다음과 같은 구조를 가진다. 스트림 생성 : 컬렉션의 목록을 스트림 객체로 변환한다. 스트림 객체는 java.util.stream 패키지의 Stream 인터페이스를 말한다. stream() 메소드는 Collection 인터페이스에 선언되어 있다. 중개 연산 : 생성된 스트림 객체를 사용하여 중개 연산 부분에서 처리한다. 이 부분에서는 아무런 결과를 리턴하지 못한다. 그래서 중개 연산(intermediate operation)이라고 한다. 종단 연산 : 마지막으로 중개 연산에서 작업된 내용을 바탕으로 결과를 리턴한다. 그래서 이 부분을 종단 연산(terminal ope..
[Java] static 키워드 유무에 따른 변수 값의 변화 static 키워드가 있는 변수는 클래스 변수 static 키워드로 생성된 변수는 해당 변수가 있는 클래스 로드 중에 초기화되며, 애플리케이션 실행 내내 메모리에 머물러 있다. 따라서 초기화 과정 없이 해당 변수, 메소드에 접근할 수 있다. static 키워드가 있는 변수를 클래스 변수라고 부른다. 아래 코드는 더하기(add) 기능을 수행하는 Calculator 클래스를 정의한 것이다. 클래스 내부에 static 키워드의 int 타입의 result 변수를 선언했다. 선언한 static 변수를 add 메소드 결과값으로 리턴하도록 코드를 구성했다. public class Calculator { public static int result = 0; public int add(int num1, int num2)..
[Java] Enum 클래스 어떤 클래스가 상수(constant)로만 만들어져 있는 경우 반드시 class로 선언할 필요는 없다. 이럴 때는 enum 키워드로 열거형 클래스를 생성할 수 있다. 자바 1.5 이전에 사용했던 열거 패턴 Enum은 자바 1.5부터 등장했다. 그 이전에는 상수값을 정수 열거 패턴, 문자열 열거 패턴 등으로 표현했다. public class Calculator { private static final String PLUS = "+"; private static final String MINUS = "-"; private static final String MULTIPLY = "*"; private static final String DIVIDE = "/"; } 열거 패턴의 단점은 클라이언트와 함께 컴파일 되..
[Java] StringBuilder 클래스 문자열을 저장하는 String은 내부의 문자열을 수정할 수 없다. String의 replace() 메소드는 내부의 문자를 변경하는 것이 아니라, 변경된 새로운 문자열을 리턴한다. String 객체를 + 연산할 경우에도 마찬가지다. String data = "ABC"; data += "DEF"; 위 예시에서 "ABC"에 "DEF"가 추가되었기 때문에 "ABCDEF"라는 하나의 String 객체로 변경되었다고 생각할 수 있지만, String 객체는 내부 데이터를 수정할 수 없으므로 "ABC"에 "DEF"가 추가된 "ABCDEF"라는 새로운 String 객체가 생성된다. 그리고 data 변수는 새로 생성된 String 객체를 참조하게 된다. 문자열을 결합하는 + 연산자를 남용하면 그만큼 string 객체의 수..
[Java] 2차원 배열의 행(row) 길이와 열(column) 길이 arrayTest.java public class arrayTest { public static void main(String[] args) { int[][] arr = new int[3][4]; System.out.println(arr.length); // 행의 개수 System.out.println(arr[0].length); // 첫 번째 행의 열의 길이 } } int[][] arr = new int[3][4]; 으로 선언한 3행 4열의 2차원 배열 arr을 시각화 시키면 아래 이미지와 같다. 행(row)의 길이는 행의 개수와 같다. 따라서 arr.length의 결과는 3이 출력된다. 언뜻 '행의 길이'라고 하면 4를 떠올릴 수 있다. 하지만 그것은 열(column)의 길이다. arr.length의..
[Java] for문 동작 순서 for문 동작 순서가 헷갈린다. 제대로 숙지하자. 순서 설명 1 초기화식이 제일 먼저 실행된다. 2 조건식을 평가해서 true이면 3 실행문을 실행시키고, false이면 for문 블록을 실행하지 않고 끝나게 된다. 블록 내부의 실행문들이 모두 실행되면 4 증감식을 실행시키고 5 다시 조건식을 평가한다.

반응형