4. [Java] 인덱스 바꾸기 - return new String(arr);
https://school.programmers.co.kr/learn/courses/30/lessons/120895
틀린 코드
class Solution {
public String solution(String my_string, int num1, int num2) {
String[] arr = String.toCharArray(my_string);
char tmp = arr[num1];
arr[num1] = arr[num2];
arr[num2] = tmp;
return arr.toString();
}
}
✅ String[] arr = String.toCharArray(my_string);
- → String.toCharArray()는 char[]를 리턴하므로 타입은 String[]이 아니라 char[]이어야 한다.
✅ String.toCharArray() 용법
- → my_string.toCharArray();
- toCharArray()는 String 클래스의 인스턴스 메서드이다.
- 그래서 String.toCharArray() ❌ (클래스 메서드 아님)
- 반드시 인스턴스(my_string)에 붙여야 한다.
✅ return arr.toString();
- char[]에서 toString()을 쓰면 주소값이 출력된다.
- → 대신 new String(arr)을 사용해야 문자열로 출력된다.
개선한 코드
class Solution {
public String solution(String my_string, int num1, int num2) {
char[] arr = my_string.toCharArray();
char tmp = arr[num1];
arr[num1] = arr[num2];
arr[num2] = tmp;
return new String(arr);
}
}
클래스 메서드 VS 인스턴스 메서드
자바에서 메서드는 크게 인스턴스 메서드와 **클래스 메서드(static 메서드)**로 나뉘는데, 이 둘은 메서드를 어떻게 호출하고 언제 사용하는지에 따라 중요한 차이를 가진다.
클래스 메서드는 static 키워드로 정의되어 있어 객체를 만들지 않아도 클래스 이름으로 바로 호출할 수 있는 메서드이다. 클래스 메서드는 객체의 고유 상태와는 무관하며, 보통 모든 인스턴스에서 공통으로 사용하는 로직을 구현할 때 사용됩니다. 대표적인 예로 Integer.parseInt("123")는 문자열을 정수로 변환하는 클래스 메서드로, Integer라는 클래스 이름만으로 바로 호출할 수 있다.
반면 인스턴스 메서드는 특정 객체가 생성되어야만 사용할 수 있는 메서드이다. 즉, new 키워드로 객체를 만든 후에야 호출이 가능하며, 주로 그 객체의 상태(멤버 변수)를 기반으로 동작한다. 예를 들어, str.length()는 문자열 객체 str의 길이를 반환하는 인스턴스 메서드인데, 이는 str이라는 객체가 존재해야만 호출할 수 있다.
인스턴스 메서드는 객체마다 상태가 다를 수 있기 때문에, 같은 메서드를 호출하더라도 객체에 따라 결과가 달라진다. 예를 들어, Person이라는 클래스에 sayHello()라는 인스턴스 메서드가 있다면, person1.sayHello()와 person2.sayHello()는 각각 다른 이름을 출력한다. 이는 각 인스턴스가 가지고 있는 name 값이 다르기 때문이다.
이처럼 인스턴스 메서드는 객체의 고유한 데이터를 다루고 조작할 때 유용하며, 클래스 메서드는 그와 무관한 공통 기능을 제공할 때 사용된다. 개발자는 기능의 목적에 따라 두 메서드 중 적절한 쪽을 선택해야 한다. 객체마다 달라지는 동작이 필요하다면 인스턴스 메서드, 객체 없이 호출해도 되는 범용적인 기능이라면 클래스 메서드를 사용하는 것이 좋다.
✅ 1. 인스턴스 메서드 (Instance Method)
정의
- 객체를 생성해야 호출할 수 있는 메서드
- 객체의 상태(필드 값)에 따라 동작이 달라질 수 있음
특징
- new 키워드로 인스턴스를 만든 후 사용
- 보통 객체 내부의 데이터를 다룰 때 사용됨
예시
public class Person {
String name;
public void sayHello() {
System.out.println("Hello, my name is " + name);
}
}
// 사용
Person p = new Person();
p.name = "Dain";
p.sayHello(); // 출력: Hello, my name is Dain
✅ 2. 클래스 메서드 (Class Method)
정의
- 객체 생성 없이 호출 가능한 메서드
- static 키워드로 정의됨
특징
- 클래스 이름으로 직접 호출 가능
- 객체의 상태와 무관하게 동작함
- 보통 공통 기능, 유틸리티 기능 등에 사용됨
예시
public class MathUtil {
public static int add(int a, int b) {
return a + b;
}
}
// 사용
int result = MathUtil.add(3, 5); // 객체 없이 호출 가능