5. [Java] 한 번만 등장한 문자 (문자열)
https://school.programmers.co.kr/learn/courses/30/lessons/120896
틀린 코드
import java.util.*;
class Solution {
public String solution(String s) {
int[] cnt = new int[26];
for(char c : s.toCharArray()) {
cnt[c - 'a']++;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 26; i++) {
if (cnt[i] == 1) sb.append((char)i+'a');
}
return sb.toString();
}
}
✅ String[]sb.append((char)i arr+ = String.toCharArray(my_string)'a');
→이String.toCharArray()는int를char[]를 리턴하므로char 타입은으로String[]이형변환하려는아니라의도지만,char[]이실제로는 그냥 int로 연산된다.
(char)i + 'a' // => 정수 + 정수 → int로 연산됨
예를 들어, i = 0일 때
(char)0 + 'a' = 0 + 97 = 97 → sb.append(97) ⇒ 문자열 "97"
괄호의 위치를 바꿔야 한다.
i + 'a' 전체를 char로 캐스팅해야 문자로 제대로 변환된다.
sb.append((char)(i + 'a'));
개선한 코드
import java.util.*;
class Solution {
public String solution(String my_string, int num1, int num2)s) {
char[int[] arrcnt = my_string.new int[26];
for(char c : s.toCharArray()) {
cnt[c - 'a']++;
}
StringBuilder sb = new StringBuilder();
charfor tmp(int i = arr[num1]0; i < 26; i++) {
if (cnt[i] == 1) sb.append((char)(i + 'a'));
arr[num1] = arr[num2];
arr[num2] = tmp;}
return new String(arr)sb.toString();
}
}
클래스 메서드 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); // 객체 없이 호출 가능