자바에서 클래스 재사용 할 때 문제점입니다.
글쓴이: jang900824 / 작성시간: 일, 2012/12/02 - 9:15오후
import java.util.*; ...생략 return (double)numberStack.poll(); ...생략
위의 코드는 제가 만든 계산기 클래스의 일부분인데
numberStack은 LinkedList타입이고 저 안에는 숫자가 double형식으로, 혹은 연산자가 String 형식으로 저장되어 있습니다.
물론 안에 들어가면 object 형식으로 바뀌겠지만요.
문제는 원래 CUI형식으로 코드를 짰을 땐(프로젝트 메인 메서드가 CUI인 형태로 클래스를 새로 만들어 코드를 짰을 때)전혀 문제가 없었는데
GUI프로젝트를 새로 만들고 거기다가 저 클래스를 넣으니
'inconvertible type'
required: double
found: object
즉 바꿀 수 없는 타입이라고 에러가 뜨는 겁니다.
다른 프로젝트로 옮길 때 문제가 생겼나 싶어서 CUI형식의 프로젝트를 하나 더 만들어서 거기다가 복사 해 봤더니 그 때는 문제가 없었습니다.
GUI에서 일부 파일이 import되지 않았거나 하는거 같은데 무슨 문제일까요?
Forums:
찾아 봤습니다.
정리해보면.
- CUI 인지. CLI 인지. 둘다 있네요.
- 형변환을 하려는데. java.lang.* 이 자동 포함되지 않아서. 문제가 있을지도 모릅니다.
지피지기 자바2 장병주저 193p보면. java.lang은 자동으로 import 된다고 합니다.
그렇지만. String의 경우는 상속 받지 못하도록. final 선언어 되어 있다고 합니다.
그것이 관계가 있어서 일어난 현상이 아닌가 모르겠습니다.?? 한번 java.lang.추가해보는것도 좋다고 생각됩니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
답글 감사합니다
하지만 이미 실험해 봤던 경우입니다. 물론 해결 안됐구요...
링크 들어가 보면서 알아보겠습니다. 감사합니다.
컴파일 에러 나는 것이 당연합니다. 안나는 것이
컴파일 에러 나는 것이 당연합니다. 안나는 것이 이상하네요.
LinkedList
> LinkedList.poll() 또는 type
> LinkedList.poll() 또는 type parameter 없이 사용한 LinkedList.poll() 은 Object 타입의 객체를 반환합니다.
이 부분을 다음과 같이 수정합니다.
> LinkedList<Object>.poll() 또는 type parameter 없이 사용한 LinkedList.poll() 은 Object 타입의 객체를 반환합니다
그런데 CUI에선 문제 없이 잘 돌아 갔습니다.
위의 실행문은 제가 컴파일러에서친 그대로를 올린 것입니다.
그리고 실행 결과는 4.8이 나왔습니다.
Object타입이 반환 되었지만 캐스팅에 의해 double 타입으로 바뀐 것입니다.
컴파일러도 문제를 제기하지 않았고 컴파일 결과도 정상이었습니다.
근데 GUI로 class파일을 넘겼을 땐 똑같은 코드임에도 불구하고
에서 컴파일러가 컴파일 하기 전 코딩단계에서 빨간 밑줄을 그으며 오류라고 표시를 합니다.
오류 내용은 본문과 같고요.
를 추가 해 봐도 마찬가지였습니다.
그리고 타입을 지정 해 줄 수가 없는게 double 뿐만 아니라 String 타입도 같이 저장되기 때문입니다.
그래서 원래 클래스에선 두 타입을 혼합해서 썼습니다.
java7 에서부터는 합법이고, 그 이전에서는
java7 에서부터는 합법이고, 그 이전에서는 불법입니다.
java7을 사용하고 계신 것 같으니 컴파일시에 -source 1.5 또는 -source 1.6 옵션을 주셔서 테스트해볼 수 있을겁니다.
아무 옵션도 없으면 -source 1.7 과 마찬가지이고, Object를 double로 캐스팅하는 것이 허용됩니다.
프로젝트 설정에서 컴파일러 옵션을 잘 살펴보세요. GUI 프로젝트에 -source 1.5 또는 -source 1.6 이 들어가 있을 가능성이 큽니다.
그리고, 한 collection에 두 타입을 같이 넣는 것은 좋은 디자인이 아닙니다.
enum TokenType {
OPERAND, OPERATOR
}
class Token {
TokenType type;
Object value;
}
같은 개념의 클래스를 만들어 사용하시는 것이 좋습니다.
댓글 달기