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
        }
    }
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)