JavaRush /Java Blog /Random-KO /초보 프로그래머의 8가지 흔한 실수

초보 프로그래머의 8가지 흔한 실수

Random-KO 그룹에 게시되었습니다
안녕하세요! 오늘 우리는 Java 초보 개발자뿐만 아니라 초보 개발자가 흔히 범하는 8가지 실수 목록을 살펴보겠습니다. 인터넷에서 그러한 컬렉션을 많이 찾을 수 있습니다. 그 중 다수는 서로 유사합니다. 이 목록을 작성할 때 우리는 공부와 업무 중에 이러한 실수를 저질렀는지 여부라는 하나의 기준에 따라 안내되었습니다. :) 우선 순위가 아니며 이해하고 기억하는 데 똑같이 중요합니다.
  1. 를 사용하여 객체를 비교합니다 ==.

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

    참조는 메모리의 주소를 가리키며, 서로 다른 주소에 있는 경우 비교를 통해 가 ==반환됩니다 false.

    public class Car {
    
       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);//ошибка компиляции, так нельзя!
       }
    
       public void printX() {
    
           System.out.println(staticX);//а так можно!
       }
    }
  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. 코드 작성 규칙을 무시합니다.

    그리고 이는 특정 "기술적" 원칙을 준수하는 것뿐만 아니라 진부한 명명 규칙에도 적용됩니다.

    " 변수 이름을 지정하는 방법 ", " 메소드 이름을 작성하는 방법 " 이라는 모든 규칙은 이유가 있어서 만들어졌습니다. 이는 코드의 가독성에 큰 영향을 미칩니다.

    Ведь code не всегда будет только твоим. Ты можешь перевестись на другой проект в компании, и он перейдет по наследству к твоим коллегам, которые будут явно не в восторге, получив в работу что-то вроде этого:

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

    Твой code может быть гениальным с точки зрения производительности, но если его невозможно прочитать и понять How он, собственно, работает, цена его, увы, невелика.

    Придерживайся стандартов написания, и твой code, даже далекий от идеала, хотя бы прочтут более опытные товарищи и подскажут, что с технической точки зрения в нем можно улучшить :)

  5. Непонимание работы класса String

    public class Main {
    
       public static void main(String[] args) {
    
           String s1 = "Я изучаю Java";
           String s2 = new String("Я изучаю Java");
    
           System.out.println(s1 == s2);
       }
    }

    Если ты не знаешь, почему этот code выводит false, знания явно нужно подтянуть:)

    Новички часто не знают что такое String Pool и How он работает.

    Как следствие, не до конца ясно, How правильно сравнивать строки в своем codeе. В одной из наших лекций мы подробно рассматривали эту тему

  6. Неправильная работа с исключениями.

    Это свойственно не только новичкам, но и опытным разработчикам. Причин несколько.

    Во-первых, универсального рецепта не существует. Ошибки в программе бывают разные, сценарии их обработки, соответственно, тоже. Во-вторых, не все понимают структуру stackTrace, а антипаттернов обработки ошибок очень много, и каждый из них «неправилен» по-своему. Так что вариантов сделать неправильно здесь намного больше, чем где бы то ни было.

    Распространенные антипаттерны приведены здесь:

  7. Неполное понимание работы операторов (арифметических, логических и других).

    초보 프로그래머의 8가지 흔한 실수 - 2

    Простой пример. Сможешь сходу сказать, что выведет этот code?

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

    Если ты ответил неправильно or наугад, значит, в этой области пока есть пробелы:)

    Код выведет false, потому что приоритет у оператора сравнения == выше, чем у постфиксного инкремента ++. Поэтому сначала будет выполнено сравнение 7 == i, и только потом - операция i++.

    По этой теме, кстати, у нас тоже была подробная лекция. Вот link, если пропустил.

  8. Пропуск слова break в операторе switch.

    Эту ошибку, вероятно, допускали многие из читателей!)

    public class Main {
    
       public static void main(String[] args) {
    
           int i = 1;
    
           switch (i) {
    
               case 1: {
                   System.out.println("Число равно 1");
               }
               case 2: {
                   System.out.println("Число равно 2");
               }
               case 3: {
                   System.out.println("Число равно 3");
               }
           }
       }
    }

    В результате на них обрушивается водопад из всех возможных вариантов:

    Вывод:

    
    Число равно 1
    Число равно 2
    Число равно 3

    Оператор break прерывает работу оператора switch в момент, когда отработал один из вариантов. Не стоит о нем забывать, иначе результат может быть неожиданным :)

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