본문 바로가기

개발공부/JAVA8

[JAVA] System.out.println()을 쓰면 안 되는 이유 나의 경우 로깅에 대해 진지하게 고민해 본 적도 없었거니와, 학원에서도 회사에서도 System.out.println을 자주 활용했었기 때문에 당연하게 생각하고 있었다. 그런데 System.out.println을 쓰면 안 된다니? 처음 듣고 충격을 받아서, 더 자세하게 알아보고자 몇 가지 글을 찾아봤다. 우선 몇 가지의 이유가 있었는데, 로그가 표준으로 출력되기 때문에 어떠한 파일로 저장되지 않고 한 번 출력된 후 휘발되기 때문에 에러가 났을 때 추적하기 어렵다는 것과, 인자로 전달한 문자열만 출력되기 때문에 문제가 발생한 일시, 문제 발생 위치 등에 대한 정보는 알기가 어렵다는 것도 있었다. System.out.println() 성능 저하 문제 그 중에서도 주목해볼 문제는 '성능저하'에 대한 것이었다. .. 2022. 9. 26.
[JAVA] String, StringBuilder, StringBuffer 자바에서 문자열을 다룰 때 String, StringBuilder, StringBuffer 클래스를 사용하게 된다. 보통 개발할 때 String을 많이 사용했는데, 이 세가지가 분명한 차이점과 쓰임이 있다는 걸 알게 됐다. String String에 값을 할당하면 Heap의 String Constant Pool에 저장된다. 그 값을 변화할 경우에는 String Class에서 새로운 String 객체를 생성하는 것이고, 기존 객체는 GC에 의해 제거된다. String이 불변성(immutable)을 갖고있기 때문이다. 따라서, 자주 변하는 객체를 String으로 생성하면 효율성이 떨어진다. 연산이 자주 일어나는 경우에는 StringBuilder와 StringBuffer를 사용하는 게 바람직하다. Abstra.. 2022. 9. 22.
[JAVA] equals() 와 hashCode() quals() equals가 구현된 방법은 2개의 객체가 참조하는 것이 동일한지(동일성 비교)를 확인하는 것이다. 즉, 2개의 객체가 가리키는 곳이 동일한 메모리 주소일 경우에만 동일한 객체가 된다. public boolean equals(Object obj) { return (this == obj); } 따라서, 두 객체가 타입과 속성이 같으면 같다고 비교하고 싶으면, equals()를 재정의(override)해서 동등성 비교를 하면 된다. 참고로, String 객체에서 equals() 메소드를 호출하면 자연스럽게 동등성 비교가 되는데, 이는 String Class가 equals()를 재정의하고 있기 때문이다. public boolean equals(Object anObject) { if (this =.. 2022. 9. 21.
[JAVA] 메모리 구조(Stack/Heap) 모든 자바 프로그램은 자바 가상 머신(JVM)을 통해서 실행된다. 자바 프로그램이 실행되면, JVM은 운영 체제로부터 해당 프로그램을 수행할 수 있도록 필요한 메모리를 할당받는다. 프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 3가지 있다. method 영역 자바 프로그램에서 사용되는 클래스에 대한 정보와 함께 클래스 변수(static variable)가 저장되는 영역으로, JVM은 자바 프로그램에서 특정 클래스가 사용되면 해당 클래스의 클래스 파일(*.class)를 읽어들여, 해당 클래스에 대한 정보를 메소드 영역에 저장한다. Stack 영역 자바 프로그램에서 메소드가 호출될 때 메소드의 스택 프레임이 저장되는 영역으로, JVM은 자바 프로그램에서 메소드가 호출되면, 메소드의 호출과 관계되는.. 2022. 9. 21.