CodeGym /Java Blog /무작위의 /초보 프로그래머가 흔히 저지르는 8가지 실수
John Squirrels
레벨 41
San Francisco

초보 프로그래머가 흔히 저지르는 8가지 실수

무작위의 그룹에 게시되었습니다
안녕! 오늘 우리는 초보(및 기타) Java 개발자가 저지르는 8가지 매우 일반적인 실수를 살펴보겠습니다. 웹에서 이러한 목록을 많이 찾을 수 있습니다. 대부분은 서로 비슷합니다. 우리가 목록을 작성할 때 우리는 하나의 기준에 따라 안내되었습니다: 우리가 공부하는 동안 또는 고용 중에 실수를 저질렀는지 여부 :) 그것들은 중요도에 따라 분류되지 않습니다. 그것들은 당신이 이해하고 기억하는 데 똑같이 중요합니다.
  1. == 를 사용하여 객체를 비교합니다 .

    == 연산자 는 개체 참조를 비교합니다.

    참조는 메모리의 주소를 가리킵니다. 서로 다른 주소에 저장되어 있는 경우 ==를 사용한 비교는 false 를 반환합니다 .

    
    public class Vehicle {
     
        String model;
        int maxSpeed;
        int yearOfManufacture;
     
        public Car(String model, int maxSpeed, int yearOfManufacture) {
            this.model = model;
            this.maxSpeed = maxSpeed;
            this.yearOfManufacture = yearOfManufacture;
        }
     
        public static void main(String[] args) {
            Car ferrari = new Car("Ferrari 360 Spider", 280, 1996);
            Car ferrariTwin = new Car("Ferrari 360 Spider", 280, 1996);
            System.out.println(ferrari == ferrariTwin);
        }
    }
    

    객체를 비교하기 위해 Object 클래스에는 equals() 라는 특수 메서드가 있습니다 . 솔직히 기본 구현은 나쁘지 않습니다.

    
    public boolean equals(Object obj) {
        return (this == obj);
    }
    

    Object 클래스 자체 에서 equals() 메서드는 두 참조의 비교로 구현됩니다. 차례로 개체를 올바르게 비교하려면 특정 개체에 대한 특정 프로그램과 관련된 기준에 따라 이 방법을 재정의해야 합니다. 평등의 기준은 당신에게 달려 있습니다.

    잊지 말아야 할 유일한 것은 equals() 를 적절하게 재정의하기 위한 요구 사항 목록입니다 . 인터넷에서 쉽게 찾을 수 있습니다.

  2. 정적 메서드에서 비정적 변수 사용(또는 그 반대).

    "정적 컨텍스트에서 비정적 변수 x를 참조할 수 없습니다"라는 메시지를 본 적이 있다면 클럽에 오신 것을 환영합니다 :)

    정적 메서드는 비정적(인스턴스) 변수에 액세스할 수 없습니다.

    이는 의미가 있습니다. 결국 정적 메서드는 해당 클래스의 객체를 생성하지 않고 호출할 수 있으며 모든 필드는 특정 객체에 속합니다. 그리고 여기에 오류를 일으키는 모순이 있습니다.

    그건 그렇고, 다른 방법으로 가도 잘 작동합니다. 정적이 아닌 메서드에서 정적 변수를 사용할 수 있습니다.

    
    public class Main {
     
        public int x = 10;
     
        public static int staticX = 100;
     
        public static void main(String[] args) {
     
            System.out.println(x); // Compilation error - you can't do this!
        }
     
        public void printX() {
     
            System.out.println(staticX); // But you can do this!
        }
    }
    

  3. 인수가 메서드에 전달되는 방식(참조 또는 값)에 대한 오해.

    개체와 프리미티브는 두 가지 방법으로 메서드에 전달됩니다. 둘째, 값으로.

    초보자는 종종 이 개념을 이해하기 어렵습니다. 그 결과 코드가 예기치 않게 작동합니다.

    
    public class Main {
     
        public static void main(String[] args) {
     
            int x = 7;
            incrementNumber(x);
            System.out.println(x);
     
            Cat cat = new Cat(7);
            catLevelUp(cat);
            System.out.println(cat.getAge());
     
        }
     
        public static void catLevelUp(Cat cat) {
     
            cat.setAge(cat.getAge()+1);
        }
     
        public static void incrementNumber(int x) {
            x++;
        }
    }
    

    어떤 숫자가 증가하고 어떤 숫자가 증가하지 않을지 정확히 모른다면(평범한 이전 숫자 또는 고양이의 나이) 주제에 대한 강의를 다시 읽으십시오 .

  4. 코딩 규칙을 무시합니다.

    이는 특정 "기술적" 원칙 준수뿐만 아니라 일상적인 명명 규칙에도 적용됩니다.

    이 모든 규칙(변수 이름 지정 방법, 메서드 이름 작성 방법)은 이유가 있어서 만들어졌습니다. 코드의 가독성에 진정으로 영향을 미칩니다.

    결국, 코드는 항상 당신만의 것이 아닙니다. 회사의 다른 프로젝트로 전송될 수 있습니다. 당신의 코드를 물려받은 당신의 동료들은 분명히 다음과 같은 것을 보고 기뻐하지 않을 것입니다.

    
    public class Cat {
     
        private int S_O_M_E_T_H_I_N_G = 7;
        public String striiiiiiiiiiiiiing;
        protected double I_HAVE_NO_IDEA_WHAT_THIS_IS = 3.14;
        boolean random = Math.random() > 0.5;
     
    }
    

    귀하의 코드는 매우 뛰어난 성능을 가질 수 있지만 실제 작동 방식을 읽고 이해하는 것이 불가능하다면 아아, 별로 가치가 없습니다.

    코딩 표준을 고수한다면 코드가 이상적이지 않더라도 최소한 경험이 많은 동료가 기술적인 관점에서 코드를 개선할 수 있는 방법을 알려줄 수 있습니다. :)

  5. String 클래스에 대한 오해

    
    public class Main {
     
        public static void main(String[] args) {
     
            String s1 = "I'm learning Java";
            String s2 = new String("I'm learning Java");
     
            System.out.println(s1 == s2);
        }
    }
    

    이 코드가 false 를 표시하는 이유를 모른다면 당연히 지식을 강화해야 합니다. :)

    초보자는 종종 String Pool 과 그것이 어떻게 작동하는지 알지 못합니다.

    결과적으로 그들은 코드에서 문자열을 적절하게 비교하는 방법을 완전히 이해하지 못합니다. 우리는 수업 중 하나 에서 이 주제를 자세히 살펴보았습니다 .

  6. 예외를 잘못 처리합니다.

    초심자만 이것에 걸려 넘어지는 것은 아닙니다. 숙련된 개발자도 실수합니다. 그 이유는 많습니다.

    첫째, 보편적인 레시피는 없습니다. 프로그램에는 모든 종류의 다양한 오류와 다양한 오류 처리 시나리오가 있습니다.

    둘째, 모든 사람이 스택 추적의 구조를 이해하는 것은 아닙니다. 많은 오류 처리 안티패턴이 있으며, 각각은 고유한 방식으로 "잘못" 있습니다. 이것은 다른 어떤 것보다 오류 처리를 잘못 처리하는 것이 훨씬 더 쉽다는 것을 의미합니다.

  7. 연산자(산술, 논리 및 기타)의 작동 방식을 완전히 이해하지 못합니다.

    초보 프로그래머가 흔히 저지르는 8가지 실수 - 2

    다음은 간단한 예입니다. 이 코드가 무엇을 표시할지 바로 알 수 있습니까?

    
    public class Main {
     
        public static void main(String[] args) {
     
            int i = 6;
            System.out.println(7 == i++);
        }
    }
    

    답이 틀렸거나 추측만 했다면 여전히 이 분야에 지식 격차가 있는 것입니다 :)

    동등 연산자( == )가 후위 증분 연산자( ++ )보다 우선 순위가 높기 때문에 코드는 false 를 표시합니다 . 따라서 7 == i 비교가 먼저 수행되고 그 다음에 i++ 연산이 수행됩니다.

    그건 그렇고, 우리는 이것에 대한 자세한 교훈도 받았습니다. 놓친 경우 링크 입니다 .

  8. switch 문 에서 단어 break를 생략합니다 .

    이 기사를 읽는 많은 사람들이 분명히 이런 실수를 저질렀습니다! :)

    
    public class Main {
     
        public static void main(String[] args) {
     
            int i = 1;
     
            switch (i) {
     
                case 1: {
                    System.out.println("The number is equal to 1");
                }
                case 2: {
                    System.out.println("The number is equal to 2");
                }
                case 3: {
                    System.out.println("The number is equal to 3");
                }
            }
        }
     }
    

    결과적으로 실행은 가능한 모든 옵션을 통해 넘어집니다.

    산출:

    숫자는 1입니다 숫자는 2입니다 숫자는 3입니다

    옵션 중 하나의 실행이 완료되면 break 문은 switch 문의 실행 중단 합니다 . 잊지 마세요 그렇지 않으면 예기치 않은 결과가 나타날 수 있습니다 :)

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION