| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- HashMap
- 자료구조
- 자바기초
- 프로그래밍기초
- 클린코드
- 코딩테스트
- JVM
- 객체지향
- 개발자팁
- 예외처리
- 가비지컬렉션
- 자바프로그래밍
- Java
- 코딩공부
- 프로그래머스
- 코딩테스트준비
- 파이썬
- 메모리관리
- 코딩인터뷰
- 자바개발
- 멀티스레드
- 코딩테스트팁
- 정렬
- 개발자취업
- 자바공부
- 자바
- 알고리즘공부
- 백준
- 개발공부
- 알고리즘
- Today
- Total
코드 한 줄의 기록
자바 개발자가 꼭 알아야 할 핵심 메서드 활용 가이드: System.out.println(), equals(), hashCode(), toStr 본문
자바 개발자가 꼭 알아야 할 핵심 메서드 활용 가이드: System.out.println(), equals(), hashCode(), toStr
CodeByJin 2025. 9. 9. 08:58자바를 공부하면서 가장 먼저 만나게 되는 메서드들은 주로 출력, 객체 비교, 문자열 변환과 관련된 것들입니다.
이 중에서도 System.out.println(), equals(), hashCode(), toString() 메서드는 자바 개발자라면 반드시 이해하고 숙달해야 할 필수 기능으로, 실무에서도 자주 사용됩니다.
System.out.println() – 콘솔 출력의 시작과 끝
System.out.println()의 기본 구조
System: 자바에서 미리 정의된 표준 입출력, 시스템 속성 등을 다루는 클래스out:System클래스의 정적 필드로,PrintStream타입의 표준 출력 스트림println():PrintStream클래스의 메서드로, 인자로 전달된 값을 문자열로 변환하여 출력한 뒤 줄바꿈
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Java!"); // Hello, Java! 출력 후 줄바꿈
}
}
다양한 오버로드 활용
println() 메서드는 다양한 타입(int, boolean, char[], Object 등)을 받을 수 있도록 오버로드되어 있습니다. 예를 들어:
int age = 30;
double score = 85.5;
boolean isActive = true;
System.out.println(age); // 30
System.out.println(score); // 85.5
System.out.println(isActive); // true
System.out.println(null); // null
출력과 성능 이슈
- 버퍼링:
System.out은 기본적으로 AutoFlush가 활성화되어 있지 않아,println()호출 시마다 버퍼를 플러시합니다. 과도한 출력은 성능 저하를 초래할 수 있습니다. - 대안: 로그 프레임워크(Log4j, SLF4J 등)를 사용해 레벨별 로그를 관리하는 것이 권장됩니다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogExample {
private static final Logger logger = LoggerFactory.getLogger(LogExample.class);
public static void main(String[] args) {
logger.debug("디버그 메시지");
logger.info("정보 메시지");
}
}
equals() – 객체 동등성 비교의 핵심
equals()와 ==의 차이
==: 참조 동일성(reference equality) 비교. 두 객체가 힙 메모리에서 같은 주소를 가리키는지를 확인.equals(): 논리적 동등성(logical equality) 비교. 객체 내부의 값이 같은지를 확인하도록 재정의할 수 있음.
String a = new String("Java");
String b = new String("Java");
System.out.println(a == b); // false
System.out.println(a.equals(b)); // true
equals() 재정의 시 필수 규칙
- 대칭성:
a.equals(b)가 참이면b.equals(a)도 참 - 반사성:
a.equals(a)는 항상 참 - 추이성:
a.equals(b)&&b.equals(c)이면a.equals(c)참 - 일관성: 반복 호출 시 결과 불변(객체가 변경되지 않는 한)
- null 비교:
x.equals(null)은 false 반환
예제: 사용자 정의 클래스에서 equals() 구현
public class Person {
private String name;
private int age;
// 생성자, getter 등 생략
@Override
public boolean equals(Object obj) {
if (this == obj) return true; // 동일 참조
if (!(obj instanceof Person)) return false; // 타입 확인
Person other = (Person) obj;
return Objects.equals(name, other.name) // 필드 비교
&& age == other.age;
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
hashCode() – 해시 기반 컬렉션에서의 키
hashCode()의 역할
hashCode()는 객체를 해시 테이블(HashMap, HashSet 등)의 버킷(bucket) 위치로 매핑하기 위한 정수값을 반환합니다. 동일한 논리적 객체라면 equals()가 true인 두 객체는 반드시 동일한 hashCode()를 반환해야 합니다.
hashCode() 구현 가이드
- 일관성: 반복 호출 시 같은 값을 반환(단, 내부 필드가 변경되면 값 변경 가능)
- equals 연동:
equals()가 true인 객체는 동일 hashCode - 퍼포먼스: 해시 충돌 최소화
예제: Person 클래스의 hashCode()
@Override
public int hashCode() {
return Objects.hash(name, age);
}
Objects.hash()는 가변 인자(Varargs)를 받아 적절한 해시값을 생성하며, 직접 구현 시 보통 31을 곱하는 방식이 활용됩니다.
@Override
public int hashCode() {
int result = 17;
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + age;
return result;
}
toString() – 객체 정보의 문자열 표현
기본 toString()의 한계
Object 클래스에서 제공하는 기본 toString() 구현은 클래스 이름 + @ + 해시코드만 반환해 유용한 정보를 담지 않습니다.
Person p = new Person("Alice", 25);
System.out.println(p.toString()); // com.example.Person@3e3abc88
toString() 재정의의 중요성
디버깅, 로그, 모니터링, API 응답 등에서 객체의 상태를 사람이 알아보기 쉽게 표현하려면 toString()을 재정의해야 합니다.
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
- IDE(이클립스, IntelliJ) 자동 생성 기능 활용
- Lombok 라이브러리의
@ToString애너테이션 사용
import lombok.Data;
@Data
public class Person {
private String name;
private int age;
}
// @Data는 toString(), equals(), hashCode()를 자동 생성
실전 팁: 메서드 조합을 통한 객체 관리
- 로그 출력
디버깅 시toString()과println()의 조합 활용logger.info("현재 사용자 정보: {}", user); - 컬렉션 탐색
HashSet에 사용자 객체 추가 전 동등성 확인Set<Person> set = new HashSet<>(); set.add(new Person("Bob", 30)); System.out.println(set.contains(new Person("Bob", 30))); // true - 테스트 코드
JUnit을 활용한 equals/hashCode 검증@Test void testEqualsAndHashCode() { Person p1 = new Person("Charlie", 40); Person p2 = new Person("Charlie", 40); assertEquals(p1, p2); assertEquals(p1.hashCode(), p2.hashCode()); }
이번 글에서는 자바 개발자라면 반드시 알아야 할 System.out.println(), equals(), hashCode(), toString() 네 가지 메서드를 집중 탐구했습니다. 각 메서드의 기본 개념부터 재정의 시 주의사항, 실전 팁까지 폭넓게 다뤘으니, 직접 코드에 적용하면서 익혀보시기 바랍니다.
- 추가 학습 자료
- 《Effective Java》 – Item 8, 9, 10 (equals, hashCode, toString)
- 공식 자바 문서:
java.lang.ObjectAPI 레퍼런스 - Lombok 프로젝트 공식 홈페이지
위 네 가지 메서드를 마스터하면 자바 객체 관리와 디버깅, 컬렉션 활용이 한층 쉬워집니다. 꾸준히 연습해보세요!
자바 HashMap과 HashSet, 실무에서 제대로 활용하기 - 성능까지 고려한 완벽 가이드
HashMap과 HashSet의 핵심 차이점HashMap은 키-값 쌍으로 데이터를 저장하는 Map 인터페이스의 구현체이고, HashSet은 중복을 허용하지 않는 Set 인터페이스의 구현체입니다. 흥미롭게도 HashSet은 내부적으
byteandbit.tistory.com
'JAVA' 카테고리의 다른 글
| Java 개발자를 위한 필수 가이드: main 메소드 의존 습관을 버리고 깔끔한 코드로 나아가는 길 (0) | 2025.09.11 |
|---|---|
| 자바 변수 초기화와 스코프(Scope) 완벽 정리: 실무에서 놓치기 쉬운 함정들 (0) | 2025.09.10 |
| 자바 HashMap과 HashSet, 실무에서 제대로 활용하기 - 성능까지 고려한 완벽 가이드 (0) | 2025.09.08 |
| 자바 String 문자열의 불변성(immutable) 이해하기: 완벽 가이드 (0) | 2025.09.07 |
| Java 기본 자료형과 객체형 변수 완전 정복: 선언부터 초기화까지 실전 가이드 (0) | 2025.09.06 |