Java로 Python의 Range와 유사한 기능을 하는 클래스를 만들고 있는데 Cannot find symbol 에러가 계속 발생합니다.
조회수 1183회
this.변수명이 들어간 라인에서 error: cannot find symbol 가 발생합니다. 자바를 처음 사용하는 지라 잘 이해가 안가기는 하는데 this를 사용하면 파이썬의 self 처럼 객체 안의 변수에 접근 할 수 있는 것 아닌가요? 이 경우는 Range안에 있는 클래스라서 super를 써야 하나 했더니 그래도 여전히 오류가 납니다. 오류가 나는 부분은 private class RangeIterator implements Iterator<Integer>
입니다.
import java.util.ArrayList;
import java.util.Iterator;
import java.util.zip.DataFormatException;
import java.util.NoSuchElementException;
//import sun.font.TrueTypeFont;
/**
* Simulates python's range function
*/
public class Range implements Iterable<Integer> {
// you probably need some variables here
private int start;
private int stop;
private int diff;
public Range(int start, int stop, int diff) {
this.diff = diff;
this.start = start;
this.stop = stop;
if (diff == 0)
{
throw new DataFormatException("range() arg 3 must not be zero");
}
}
public Range(int start, int stop) {
this(start, stop, 1);
}
public Range(int stop)
{
this(0, stop, 1);
}
private class RangeIterator implements Iterator<Integer>
{
private int value = this.start;
public boolean hasNext()
{
if(this.stop >= this.value)
{
if ((this.stop - this.value) >= this.diff) return true;
else return false;
}
else
{
if((this.start - this.value) <= this.diff) return true;
else return false;
}
}
public Integer next()
{
if (hasNext())
{
try
{
return this.value;
}
finally
{
this.value += this.diff;
}
}
else
{
throw new NoSuchElementException("Iteration exceeded.");
}
}
}
public java.util.Iterator<Integer> iterator()
{
return new RangeIterator();
}
/*
* Test the Range class
*/
public static void main(String[] args)
{
System.out.println("One:");
for(Integer j : new Range(1,8,1))
{
System.out.print(j);
}
// 1234567
System.out.println("\nTwo:");
for(Integer j : new Range(1,8,2))
{
System.out.print(j);
}
// 1357
System.out.println("\nThree:");
for(Integer j : new Range(1,8))
{
System.out.print(j);
}
// 1234567
System.out.println("\nFour:");
for(Integer j : new Range(8,0,-1))
{
System.out.print(j);
}
// 87654321
System.out.println("\nFive:");
for(Integer j : new Range(8,8,1))
{
System.out.print(j);
}
// prints error msg
System.out.println("\nSix:");
for(Integer j : new Range(8,10,0))
{
System.out.print(j);
}
// prints error msg
}
}
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
첫번째 this는 파이썬 self 와 마찬가지로 객체 자신을 가리킵니다.
조금 더 부연을 하자면 대부분의 객체지향 언어는 첫번째 파라미터로 해당 메소드의 객체를 받습니다. 물론 static 으로 선언된 경우는 예외구요.
파이썬의 self 또한 언어가 잘 디자인 되었다면 꼭 명시적으로 self 등의 변수를 처리하지 않도록 했었어야 맞다고 봅니다. 파이썬은 언어 디자인 측면에서 보면 사용하기는 편할지 몰라도 많이 부족해보이기도 합니다.
각설하고 오류는 아래에서 this 는 RangeIterator 의 객체를 가리킵니다. 그런데 질문자는 Range 의 start 를 접근하고 싶은겁니다. 당연히 this 로는 접근할 수 없습니다. 또한 python 에는 없는 private 라는 접근 제한자가 있습니다. 이 접근제한자는 해당 클래스에서만 접근가능하다는 의미입니다. 파이썬에서 _변수명 와 같은 의미입니다.
private class RangeIterator implements Iterator<Integer> { private int value = this.start;
해당 오류 발생원인은 이해가 되었으리라 봅니다. 해결방법은 클래스 디자인을 다시해야 합니다.
Range 클래스내 start, stop, diff 를 static 으로 선언하고 클래스이름.변수명으로 접근하는 방법도 있을 수 있고 아래와 같이 생성자를 이용할 수 있습니다.
import java.util.ArrayList; import java.util.Iterator; import java.util.zip.DataFormatException; import java.util.NoSuchElementException; //import sun.font.TrueTypeFont; /** * Simulates python's range function */ public class Range implements Iterable<Integer> { // you probably need some variables here private int start; private int stop; private int diff; public Range(int start, int stop, int diff) throws DataFormatException { this.diff = diff; this.start = start; this.stop = stop; if (diff == 0) { throw new DataFormatException("range() arg 3 must not be zero"); } } public Range(int start, int stop) throws DataFormatException { this(start, stop, 1); } public Range(int stop) throws DataFormatException { this(0, stop, 1); } private class RangeIterator implements Iterator<Integer> { private int start; private int stop; private int diff; public RangeIterator(int start, int stop, int diff) { this.diff = diff; this.start = start; this.stop = stop; } private int value = this.start; public boolean hasNext() { if(this.stop >= this.value) { if ((this.stop - this.value) >= this.diff) return true; else return false; } else { if((this.start - this.value) <= this.diff) return true; else return false; } } public Integer next() { if (hasNext()) { try { return this.value; } finally { this.value += this.diff; } } else { throw new NoSuchElementException("Iteration exceeded."); } } } public java.util.Iterator<Integer> iterator() { return new RangeIterator(start, stop, diff); } /* * Test the Range class */ public static void main(String[] args) throws DataFormatException { System.out.println("One:"); for(Integer j : new Range(1,8,1)) { System.out.print(j); } // 1234567 System.out.println("\nTwo:"); for(Integer j : new Range(1,8,2)) { System.out.print(j); } // 1357 System.out.println("\nThree:"); for(Integer j : new Range(1,8)) { System.out.print(j); } // 1234567 System.out.println("\nFour:"); for(Integer j : new Range(8,0,-1)) { System.out.print(j); } // 87654321 System.out.println("\nFive:"); for(Integer j : new Range(8,8,1)) { System.out.print(j); } // prints error msg System.out.println("\nSix:"); for(Integer j : new Range(8,10,0)) { System.out.print(j); } // prints error msg } }
댓글 입력