xemic   3년 전

문제 풀면서 제너릭을 연습해볼겸 코딩을 하고 있습니다.
분명 코드상으론 문제가 될만한 부분이 없어보이는데 생길거같지 않던 컴파일 에러가 많이 떠서 도움을 요청하고자 질문 작성합니다.
발생한 컴파일 에러 내용은 다음과 같습니다.
(ideone.com 으로 컴파일)
Main.java:27: error: ')' expected
T pull(int num=0)
              ^
Main.java:27: error: illegal start of type
T pull(int num=0)
               ^
Main.java:27: error: <identifier> expected
T pull(int num=0)
                ^
Main.java:27: error: ';' expected
T pull(int num=0)
                 ^
Main.java:29: error: illegal start of type
if(len==0)
^
Main.java:29: error: <identifier> expected
if(len==0)
  ^
Main.java:29: error: ';' expected
if(len==0)
   ^
Main.java:29: error: illegal start of type
if(len==0)
      ^
Main.java:29: error: <identifier> expected
if(len==0)
        ^
Main.java:29: error: ';' expected
if(len==0)
         ^
Main.java:34: error: illegal start of type
else
^
Main.java:34: error: ';' expected
else
    ^
Main.java:38: error: <identifier> expected
qrrayCpy = Arrays.copyOf(qrray, len);
        ^
Main.java:39: error: <identifier> expected
qrray = new T[--len];
     ^
Main.java:40: error: illegal start of type
if(len!=0)
^
Main.java:40: error: <identifier> expected
if(len!=0)
      ^
Main.java:40: error: ';' expected
if(len!=0)
        ^
Main.java:40: error: illegal start of type
if(len!=0)
         ^
Main.java:40: error: <identifier> expected
if(len!=0)
          ^
Main.java:41: error: ';' expected
{
 ^
Main.java:42: error: <identifier> expected
int nowLen=0;
          ^
Main.java:43: error: illegal start of type
for(int i=0; i<num; i++)
^
Main.java:43: error: ')' expected
for(int i=0; i<num; i++)
         ^
Main.java:43: error: illegal start of type
for(int i=0; i<num; i++)
          ^
Main.java:43: error: <identifier> expected
for(int i=0; i<num; i++)
           ^
Main.java:43: error: ';' expected
for(int i=0; i<num; i++)
            ^
Main.java:43: error: > expected
for(int i=0; i<num; i++)
                  ^
Main.java:43: error: '(' expected
for(int i=0; i<num; i++)
                     ^
Main.java:44: error: ']' expected
qrray[nowLen++] = qrray[i];
      ^
Main.java:44: error: ';' expected
qrray[nowLen++] = qrray[i];
            ^
Main.java:44: error: ']' expected
qrray[nowLen++] = qrray[i];
                        ^
Main.java:44: error: ';' expected
qrray[nowLen++] = qrray[i];
                         ^
Main.java:45: error: illegal start of type
for(int i=num+1; i<len; i++)
^
Main.java:45: error: ')' expected
for(int i=num+1; i<len; i++)
         ^
Main.java:45: error: <identifier> expected
for(int i=num+1; i<len; i++)
             ^
Main.java:45: error: illegal start of type
for(int i=num+1; i<len; i++)
              ^
Main.java:45: error: <identifier> expected
for(int i=num+1; i<len; i++)
               ^
Main.java:45: error: ';' expected
for(int i=num+1; i<len; i++)
                ^
Main.java:45: error: > expected
for(int i=num+1; i<len; i++)
                      ^
Main.java:45: error: '(' expected
for(int i=num+1; i<len; i++)
                         ^
Main.java:46: error: ']' expected
qrray[nowLen++] = qrray[i];
      ^
Main.java:46: error: ';' expected
qrray[nowLen++] = qrray[i];
            ^
Main.java:46: error: ']' expected
qrray[nowLen++] = qrray[i];
                        ^
Main.java:46: error: ';' expected
qrray[nowLen++] = qrray[i];
                         ^
Main.java:49: error: class, interface, or enum expected
return output;
^
Main.java:50: error: class, interface, or enum expected
}

occidere   3년 전

우선 최소 컴파일에러가 나지 않을 정도로만 수정해봤습니다.

(수정된 부분은 /**/ 주석을 붙여놓았습니다.)


크게 3가지 문제가 있습니다.

1. 제너릭 타입 T는 프로그램이 실행되며 동적으로 타입이 결정되기 때문에, T 타입으로는 객체를 생성할 수 없습니다.

쉽게 생각해보면 컴파일 과정에서 바이트 코드를 생성해야 하는데 무슨 타입의 객체인지 모르기 때문에 바이트코드 생성이 불가능하여 컴파일 에러가 발생하는 것입니다.

따라서 우선은 Object 타입으로 생성 후, T 타입으로 형변환을 하는 방법을 사용하는게 쉬운 해결책입니다.

T arr[] = (T[]) new Object();

자세한 내용은 여기를 살펴보시면 좋을듯 합니다.

2. 31번 라인에서 T 타입은 객체이기 때문에 return -1을 할 수 없습니다.

자바에서 primitive type과 해당 타입과 상응하는 객체 사이에서 오토 언박싱 기능을 지원하긴 하나, 원칙적으로 T에는 뭐가 들어올지 모르는 상황이기 때문에 return null; 등으로 대체해야 합니다.

3. 자바는 디폴트 C++과는 달리, 디폴트 매개변수를 지정할 수 없습니다.(27번 라인)

T pull(int num=0) => T pull(int num) 따라서 이를 제거해 주시면 됩니다.(아마 오타일 것이라 생각합니다)


댓글을 작성하려면 로그인해야 합니다.