오늘은 Object 클래스, enum, final, String / Math 클래스,
그리고 내부 클래스와 StringBuilder까지 한 번에 정리했다.
전반적으로 이미 배웠던 개념들을 다시 묶어서 복습하는 느낌이었다.
Object 클래스는 모든 클래스의 최상위 부모 클래스이다.
다른 클래스에서 extends를 명시하지 않으면 자동으로 Object를 상속한다.
모든 객체가 공통으로 가져야 할 기본 메서드를 제공한다.
대표적인 메서드
toString()equals()hashCode()이 메서드들은 오버라이딩해서 자주 사용한다는 공통점이 있다.
toString()은 객체를 문자열로 표현하는 메서드이다.
기본 구현은 클래스이름@해시코드 형태를 반환한다.
객체를 출력할 때 변수만 출력해도
컴파일러가 자동으로 toString()을 호출한다.
public class ToStringExam {
private String name;
private int age;
public ToStringExam(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "이름 : " + name + ", 나이 : " + age + "살";
}
public static void main(String[] args) {
ToStringExam exam = new ToStringExam("홍길동", 20);
System.out.println(exam); // toString 자동 호출
System.out.println(exam.toString()); // 명시적 호출
}
}
IntelliJ에서는 Alt + Insert를 사용해
toString()을 자동 생성할 수 있다.

두 객체의 내용이 같은지 비교하려면
equals()를 오버라이딩해야 한다.
그리고 equals를 오버라이딩하면 반드시 hashCode도 같이 오버라이딩해야 한다.
equals()가 true면 hashCode()도 반드시 같아야 한다 (자바 규칙)
import java.util.Objects;
public class EqualsExam {
private int x;
private int y;
public EqualsExam(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
EqualsExam that = (EqualsExam) o;
return x == that.x && y == that.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
public static void main(String[] args) {
EqualsExam ex1 = new EqualsExam(3, 4);
EqualsExam ex2 = new EqualsExam(3, 4);
System.out.println(ex1.equals(ex2)); // true
System.out.println(ex1 == ex2); // false (주소 비교)
}
}
== : 참조 주소 비교equals() : 객체의 논리적 동등성 비교enum은 클래스에 들어갈 수 있는 값의 종류를 제한하는 타입이다.
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public class EnumTest {
public static void main(String[] args) {
Day today = Day.MONDAY;
switch (today) {
case MONDAY:
case FRIDAY:
System.out.println("평일");
break;
case SATURDAY:
case SUNDAY:
System.out.println("주말");
break;
}
}
}
final은 변경 불가를 의미한다.
| 위치 | 의미 |
|---|---|
| 변수 | 값 변경 불가 |
| 메서드 | 오버라이딩 불가 |
| 클래스 | 상속 불가 |
public final class ImmutableClass {
}
public class FinalExample {
private final int MAX = 100;
public final void display() {
System.out.println(MAX);
}
}
String은 불변 객체이다.
한 번 생성된 문자열은 변경할 수 없다.
자주 사용하는 메서드 예제
String str = " Hello Java World ";
str.length();
str.charAt(5);
str.substring(8, 12);
str.contains("Java");
str.trim();
str.replace("Java", "Python");
수학 연산을 위한 유틸리티 클래스이다.
Math.abs(-10);
Math.max(10, 20);
Math.sqrt(16);
Math.random();
Math.PI;
클래스 내부에 선언된 클래스이다.
종류
1. 멤버 내부 클래스
2. 정적 내부 클래스
3. 지역 내부 클래스
4. 익명 내부 클래스
public class OuterClass {
private int outerField = 10;
public class InnerClass {
void display() {
System.out.println(outerField);
}
}
}
익명 클래스는 한 번만 쓰고 버리는 객체로
이벤트 처리, 스레드 등에 자주 사용된다.
| 구분 | StringBuilder | StringBuffer |
|---|---|---|
| 동기화 | X | O |
| 속도 | 빠름 | 느림 |
| 사용처 | 단일 스레드 | 멀티 스레드 |
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
sb.insert(6, "Beautiful ");
sb.delete(6, 16);
sb.reverse();
문자열 반복 연결 시 StringBuilder가 훨씬 효율적이다.
오늘 수업은 실습 위주로 진행되어
어제보다 부담 없이 들을 수 있었다.
이번 주에 배운 핵심 키워드들이 워낙 많아서
오늘은 전체 흐름을 다시 복습하는 데 집중해야 할 것 같다.