[TIL] (230825) error: char cannot be dereferenced 오류 해결하기/ 원시 데이터 타입에는 메서드를 직접 호출할 수 없다.

Noh Jihyeon·2023년 8월 25일
0

TIL

목록 보기
11/49
post-thumbnail

오늘은 문자열 중 "문자 반복 출력하기" 프로그래머스 문제를 풀어보았다.
그동안 그렇게 많은 문제를 풀었다고 자신 있게 말할 수는 없지만 문제를 풀면서 처음 보는 에러였다.
해당 에러가 왜 발생했는지, 어떻게 해결해야되는지 알아보자.




🔸문제점

https://school.programmers.co.kr/learn/courses/30/lessons/120825



✅ 내 코드


class Solution {
    public String solution(String my_string, int n) {
        StringBuilder sb = new StringBuilder();
        
        for (int i=0; i<my_string.length(); i++) {
            sb.append(my_string.charAt(i).repeat(n));
        }
        
        return sb.toString();
    }
}




🔽 에러발생



/Solution.java:6: error: char cannot be dereferenced
                  sb.append(my_string.charAt(i).repeat(n));
                                                                     ^
1 error




📄 코드를 짠 이유

  1. 계속 추가되는 문자열이기 때문에 StringBuilder를 사용함

  2. for문으로 charAt(i)을 진행하면서 repeat(n)을 진행하면 될것으로 예상함



🔸시도해본 것들


🌟 my_string에 들어있는 각 문자를 n만큼 반복한 문자열을 반환하기

위의 코드는 컴파일 에러로 "char cannot be dereferenced"라는 에러 메시지는 char 타입에 대해 메서드 호출이 불가능하다는 것을 나타낸다.

🤔왜 char 타입에는 매서드 호출이 불가능한 걸까?

🔽🔽


자바에서 char은 원시 데이터 타입(Primitive data type)이다.

즉, 객체가 아니기 때문에 메서드를 호출할 수 없다고 한다.

또한 repeat() 메서드는 String 클래스의 메서드이기 때문에 char변수에는 적용할 수 없다.



나는 왜 원시타입에는 메서드를 호출하지 못한다는 건지 이해가 되질 않아 더 자세하게 찾아보았다.


자바에는 원시 타입과 참조 타입 데이터로 나눠진다는 건 알고 있었다.

내가 사용한 char은 원시 타입으로 스택 메모리에 값을 직접 저장한다.

예를 들어 int age = 25;와 같이 정수 값을 변수에 대입하면 해당 정수 값(25)이 직접 변수 age에 저장되는 것이다.

원시 타입 변수는 값을 직접 저장하기 때문에 빠른 접근과 간단한 연산에 적합하지만 객체가 아니기 때문에 메서드를 직접 호출할 수 없다.



참조타입의 경우 객체는 힙 메모리(Heap memory)에 생성, 참조 타입 변수는 해당 객체의 주소를 스택 메모리에 저장한다.

예를 들어, String name = "John";와 같이 문자열을 나타내는 String 객체를 변수에 대입하면, 변수 name은 실제로 해당 문자열 객체의 주소를 가리키게 된다. 따라서 name 변수는 문자열 객체에 대한 참조를 담고 있으며, 해당 문자열 객체에 접근하거나 객체의 메서드를 호출할 수 있다.



String 클래스는 문자열을 나타내는 참조 데이터 타입으로, 
이 객체에는 문자열을 다루는 다양한 메서드를 가지고 있기 때문에 
repeat()와 같은 메서드를 사용하기 위해서는 String 객체를 생성하고 메서드를 호출해야 했던 것이다.

하지만 나는

sb.append(my_string.charAt(i).repeat(n));

에서 char 형태에 repeat()를 시도한 것으로 컴파일에러가 발생한 것이었다.

내가 원한대로 repeat()를 사용하려면 char 변수를 String으로 변환해야 하며,


이를 위해
sb.append(String.valueOf(c).repeat(n));

처럼 String.valueOf(c)를 사용하거나
sb.append("" + c).repeat(n));

처럼 "" + c와 같은 방법으로 변환해서 사용해야 했다.




🔸해결




🔸알게 된 점


솔직히 그동안 코드를 짜면서 원시 데이터 타입 변수에 대해 크게 생각해보지 않았다.

그러니 오늘처럼 원시타입에는 메서드를 사용할 수 없다는 걸 몰랐던 것이다.

실제로 문제를 풀다가 계속 오류가 나길래 다른 사람의 답을 봤었는데 위에 적었던 것처럼


< c + "" >으로 코딩이 되어있었다.


그것 이에 외는 내 코드와 구조상, 맥락상 다르지 않았기 때문에 저 하나의 차이가 만들어내는 결과가 무엇인지 궁금했다.

코드를 짤 때는 의미 없이 추가 되는 건 없으며, 참조형 변수만 집중할게 아니라 원시 타입도 정확하게 알아야겠다는 다짐을 해본다.

profile
꼭꼭 씹어서 소화시키는 맛있는 코딩

0개의 댓글