JavaRush /Java Blog /Random-KO /클래스 소개: 자신만의 클래스, 생성자 작성

클래스 소개: 자신만의 클래스, 생성자 작성

Random-KO 그룹에 게시되었습니다
안녕하세요! 오늘은 Java의 클래스에 대해 이야기하겠습니다. 클래스는 Java 프로그래밍의 핵심이라고 할 수 있습니다. 프로그래머가 되면 주요 임무는 다양한 기능을 갖춘 자신만의 클래스를 작성하는 것입니다. 클래스 소개: 자신만의 클래스, 생성자 작성 - 1이것이 무엇인지, 어떻게 작동하는지 알아봅시다. :) 이미 알고 있듯이 Java는 객체 지향 프로그래밍 언어입니다. 모든 프로그램은 어떻게든 서로 연결된 개체로 구성됩니다. 클래스는 본질적으로 객체의 템플릿입니다. 이는 개체의 모양과 기능을 결정합니다. 모든 객체는 일부 클래스의 객체입니다 . 가장 간단한 예를 살펴보겠습니다.
public class Cat {

    String name;
    int age;

}
우리가 프로그램을 작성 중이고 이 프로그램에서 무언가를 위해 고양이가 필요하다고 가정해 보겠습니다. 예를 들어 온라인 예약이 가능한 수의과 진료소가 있습니다. 우리는 클래스를 생성 Cat하고 이에 대한 두 개의 변수(문자열 name과 숫자) 를 지정했습니다 age. 이러한 클래스 변수를 필드 라고 합니다 . 본질적으로 이것은 우리가 앞으로 만들 모든 고양이를 위한 템플릿입니다. 각 고양이(클래스 객체 Cat)에는 이름과 나이라는 두 가지 변수가 있습니다.
public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
    }

}
그것이 작동하는 방식입니다! 우리는 고양이를 생성하고 이름과 나이를 지정한 후 모두 콘솔에 출력했습니다. 복잡한 것은 없습니다 :) 수업은 주변 세계의 사물과 현상을 가장 자주 설명합니다. 고양이, 테이블, 사람, 번개, 책 페이지, 바퀴 등 이 모든 것이 별도의 클래스를 사용하여 프로그램에서 생성됩니다. 이제 클래스에서 생성한 변수를 살펴보겠습니다 Cat. 이를 필드 또는 인스턴스 변수 라고 합니다 . 실제로 그 이름은 그들의 전체 본질을 드러냅니다. 클래스의 각 인스턴스 (객체) 에는 이러한 변수가 있습니다 Cat. name우리가 만드는 각 고양이는 자신만의 변수 와 를 갖게 됩니다 age. 일반적으로 논리적입니다. 실제 고양이의 경우 모든 것이 동일합니다. :) 인스턴스 변수 외에도 클래스 변수 또는 정적 변수가 있습니다. 예제에 다음을 추가해 보겠습니다.
public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";
        count++;

        Cat vasia = new Cat();
        vasia.age = 5;
        vasia.name = "Vasya";
        count++;

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
        System.out.println("We created a cat named" + vasia.name + ", his age - " + vasia.age);

        System.out.println("Total number of cats = " + count);
    }
}
콘솔 출력:

Мы создали кота по имени Барсик, его возраст - 3
Мы создали кота по имени Вася, его возраст - 5
Общее количество котов = 2
이제 우리 클래스에는 count(수량)라는 새로운 변수가 있습니다. 그녀는 생성된 고양이의 수를 세는 일을 담당합니다. 메인 메소드에서 cat을 생성할 때마다 이 변수를 1씩 증가시킵니다. 이 변수는 static 키워드로 지정됩니다 . 이는 해당 클래스의 특정 객체가 아니라 클래스 에 속한다는 것을 의미합니다 . 물론 이는 논리적입니다. 각 고양이가 고유한 이름을 가져야 한다면 모든 고양이에 대해 하나의 고양이 카운터가 필요합니다. 이것이 바로 static이라는 단어를 사용하여 달성할 수 있는 것입니다 . count모든 고양이에 대해 동일한 변수입니다. 참고: 콘솔에 인쇄할 때 barsik.countor 를 쓰지 않습니다 vasia.count. 그녀는 Barsik이나 Vasya에 속하지 않습니다. 그녀는 전체 학급에 속합니다 Cat. 그러므로 간단합니다 count. 쓸 수도 있습니다 Cat.count. 그것도 정확할 것입니다. 콘솔에 변수를 출력하는 경우에는 name작동하지 않습니다 .
public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";
        count++;

        System.out.println("We created a cat named" + name + ", his age - " + barsik.age);

        System.out.println("Total number of cats = " + count);
    }
}
오류! name각 고양이는 자신의 고양이를 가지고 있습니다. 이것이 컴파일러가 혼란스러워지는 곳입니다. "콘솔에 이름 출력? 누구 이름인가요? :/"

행동 양식

변수 외에도 각 클래스에는 메서드가 있습니다. 이에 대해서는 별도의 강의에서 더 자세히 설명하겠지만 일반적인 내용은 매우 간단합니다. 메소드는 클래스의 기능입니다. 이 클래스의 객체가 무엇을 할 수 있는지. 당신은 이미 방법 중 하나에 익숙합니다 main(). 그러나 기억하시는 것처럼 메소드는 main정적입니다. 즉, 전체 클래스에 속합니다(논리는 변수와 동일합니다). 그리고 일반적인 비정적 메서드는 우리가 만든 특정 개체에서만 호출할 수 있습니다. 예를 들어, 고양이에 대한 클래스를 작성하려면 프로그램에서 고양이가 어떤 기능을 가져야 하는지 이해해야 합니다. 이를 바탕으로 몇 가지 메서드를 작성해 보겠습니다.
public class Cat {

    String name;
    int age;

    public void sayMeow() {
        System.out.println("Meow!");
    }

    public void jump() {
        System.out.println("Jumping gallop!");
    }

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        barsik.sayMeow();
        barsik.jump();

    }
}
자, 이제 우리 수업은 실제 고양이에 대한 설명과 훨씬 더 비슷해졌습니다! 이제 우리는 이름과 나이를 가진 바르식이라는 고양이만 있는 것이 아닙니다. 그는 또한 야옹거리고 점프할 수도 있습니다! 그러한 "기능"이 없는 고양이는 어떤 종류입니까? :) 특정 객체를 가져와 barsik해당 메소드를 sayMeow()및 이라고 부릅니다 jump(). 콘솔을 봅니다.

Мяу!
Прыг-скок!
진짜 고양이! :)

나만의 수업 만들기. 추출

앞으로는 자신만의 클래스를 작성해야 합니다. 글을 쓸 때 주의해야 할 점은 무엇인가요? 변수에 관해 이야기하고 있다면 추상화 라는 것을 사용해야 합니다 . 추상화는 객체지향 프로그래밍의 네 가지 기본 원칙 중 하나입니다. 여기에는 개체의 가장 중요한 주요 특성을 강조하는 작업이 포함되며 , 그 반대의 경우도 마찬가지입니다. 즉, 중요하지 않은 이차 특성을 삭제하는 것입니다. 예를 들어, 회사 직원의 파일을 생성하고 있습니다. 직원 객체를 생성하기 위해 클래스를 작성했습니다 Employee. 회사 파일에서 직원을 설명하는 데 중요한 특성은 무엇입니까? 이름, 생년월일, 사회보장번호, 세금 식별 번호. 하지만 회사 직원 카드에 키, 눈, 머리 색깔이 필요할 가능성은 거의 없습니다. 회사에는 이 정보가 필요하지 않습니다. 따라서 클래스에 대해 변수 , , 및 을 Employee설정 하고 눈 색깔과 같은 불필요한 정보를 버리고 추상화 합니다 . 그러나 모델 에이전시를 위한 사진 모델 카탈로그를 만들면 상황이 극적으로 변합니다. 패션 모델을 설명할 때 키, 눈 색깔, 머리 색깔은 매우 중요하지만 TIN 번호는 전혀 중요하지 않습니다. 따라서 클래스에서 변수 , , 을 생성해야 합니다 . 이것이 추상화가 작동하는 방식입니다. 간단합니다! :) String nameint ageint socialInsuranceNumberint taxNumberModelint heightString hairString eyes

생성자

고양이 예로 돌아가 보겠습니다.
public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat barsik = new Cat();

        System.out.println("Something has been happening in the program for 2 hours...");

        barsik.age = 3;
        barsik.name = "Barsik";

    }
}
이 코드를 보고 우리 프로그램에 어떤 문제가 있는지 추측해 보세요. 우리 프로그램에는 두 시간 동안 이름도 나이도 없는 고양이가 있었습니다! 물론 이것은 완전히 잘못된 것입니다. 동물병원 데이터베이스에는 고양이에 대한 정보가 없는 고양이가 있어서는 안 됩니다. 이제 우리는 그것을 프로그래머에게 맡깁니다. 이름과 나이를 표시하는 것을 잊지 않으면 모든 것이 괜찮을 것입니다. 그가 잊어버리면 데이터베이스에 알 수 없는 고양이라는 오류가 있을 것입니다. 이 문제를 어떻게 해결할 수 있나요? 이름과 나이 없이 고양이를 만드는 것을 어떻게든 금지할 필요가 있습니다. 여기서 생성자 함수가 도움이 됩니다 . 예는 다음과 같습니다.
public class Cat {

    String name;
    int age;

    //constructor for class Cat
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
    }
}
생성자는 본질적으로 클래스 객체의 템플릿입니다. 이 경우 각 객체에 대해 cat문자열과 숫자라는 두 개의 인수를 지정해야 한다고 지정합니다. 지금 이름없는 고양이를 만들려고 하면 성공하지 못할 것입니다.
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //error!
    }
}
이제 클래스에 생성자가 있으므로 Java 컴파일러는 객체의 모양을 알고 있으며 지정된 인수 없이는 객체가 생성되는 것을 허용하지 않습니다. this이제 생성자 내부에 표시되는 키워드를 살펴보겠습니다 . 그에게도 모든 것이 간단합니다. "this"는 영어로 "이것, 이것"을 의미합니다. 즉, 이 단어는 특정 대상을 나타냅니다. 생성자의 코드
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
" (우리가 만들고 있는) 이 고양이의 이름 = 생성자에 지정된 이름 인수. (우리가 만들고 있는) 이 고양이의 나이 = 생성자에 지정된 나이 인수." 생성자가 실행된 후 고양이에 필요한 모든 값이 할당되었는지 확인할 수 있습니다.
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        System.out.println(barsik.name);
        System.out.println(barsik.age);
    }
}
콘솔 출력:

Барсик
5
생성자가 완료되면:
Cat barsik = new Cat("Barsik", 5);
실제로 내부에서는 다음과 같은 일이 일어났습니다.
this.name = "Barsik";
this.age = 5;
그리고 객체 barsik(그것은 this)에 생성자 인수의 값이 할당되었습니다. 실제로 클래스에 생성자를 지정하지 않으면 여전히 생성자가 실행됩니다 ! 그런데 이것이 어떻게 가능합니까? O_O 사실 Java에서는 모든 클래스에 소위 기본 생성자가 있습니다 . 인수는 없지만 클래스의 객체가 생성될 때마다 실행됩니다.
public class Cat {

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
언뜻 보면 이것은 눈에 띄지 않습니다. 뭐, 우리가 오브제를 만들어서 만들어냈는데, 디자이너의 작업은 어디에 있나요? 이를 확인하기 위해 Cat우리 손으로 클래스에 대한 빈 생성자를 작성하고 그 안에 몇 가지 문구를 콘솔에 출력해 보겠습니다. 표시되면 생성자가 작동한 것입니다.
public class Cat {

    public Cat() {
        System.out.println("Created a cat!");
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
콘솔 출력:

Создали кота!
확인은 다음과 같습니다. 기본 생성자는 항상 클래스에 보이지 않게 존재합니다. 하지만 당신은 그것의 한 가지 특징을 더 알아야 합니다. 인수를 사용하여 일부 생성자를 생성하면 기본 생성자가 클래스에서 사라집니다. 사실 이에 대한 증거는 위에서 이미 살펴보았습니다. 이 코드에서는 다음과 같습니다.
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //error!
    }
}
문자열 + 숫자 에 대한 생성자를 정의했기 때문에 이름과 나이 없이 고양이를 만들 수 없습니다 Cat. 기본 생성자는 이 직후 클래스에서 사라졌습니다. 따라서 빈 생성자를 포함하여 클래스에 여러 생성자가 필요한 경우 별도로 생성해야 한다는 점을 기억하세요 . 예를 들어, 우리 동물병원에서는 이름과 나이를 모르는 집 없는 고양이들을 돕기 위해 선행을 하고 싶어합니다. 그러면 코드는 다음과 같아야 합니다.
public class Cat {

    String name;
    int age;

    //for domestic cats
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //for street cats
    public Cat() {
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        Cat streetCat = new Cat();
    }
}
이제 기본 생성자를 명시적으로 지정했으므로 두 가지 유형의 고양이를 모두 만들 수 있습니다. 생성자에서는 인수에서 값을 가져오는 것이 아니라 명시적으로 값을 할당할 수 있습니다. 예를 들어, "Street cat number..."라는 이름으로 데이터베이스에 모든 길고양이를 기록할 수 있습니다.
public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat number" + count;
    }

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat streetCat1 = new Cat();
        Cat streetCat2 = new Cat();
        System.out.println(streetCat1.name);
        System.out.println(streetCat2.name);
    }
}
count길거리 고양이 카운터라는 변수가 있습니다 . 기본 생성자를 실행할 때마다 이를 1씩 증가시키고 해당 숫자를 고양이 이름으로 할당합니다. 생성자의 경우 인수의 순서가 매우 중요합니다. 생성자에서 이름과 나이 인수를 바꿔보겠습니다.
public class Cat {

    String name;
    int age;

    public Cat(int age, String name) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 10); //error!
    }
}
오류! 생성자는 객체를 생성할 때 숫자와 문자열을 순서대로Cat 전달해야 한다고 명확하게 설명합니다 . 이것이 바로 우리 코드가 작동하지 않는 이유입니다. 자신만의 클래스를 만들 때 다음 사항을 기억하고 명심하세요.
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}

public Cat(int age, String name) {
    this.age = age;
    this.name = name;
}
전혀 다른 두 디자이너입니다! 이제 몇 가지 문제를 해결하여 자료를 통합하세요 :)
  • 고대 유물 박물관.
당신의 임무는 클래스를 디자인하는 것입니다 Artifact. 박물관에 보관된 유물은 세 가지 유형이다. 첫 번째는 박물관에서 할당한 일련번호(예: 212121) 외에는 알려진 바가 없습니다. 두 번째는 일련 번호와 그것이 만들어진 문화가 알려져 있다는 것입니다(예: 212121, "Aztecs"). 세 번째 유형은 알려진 일련 번호, 그것이 만들어진 문화, 정확한 창조 연대(예: 212121, "Aztecs", 12)에 관한 것입니다. Artifact박물관에 보관된 유물을 설명하는 클래스를 만들고 이에 필요한 생성자 수를 작성합니다. 메서드에서 main()각 유형별로 하나의 아티팩트를 생성합니다.
public class Artifact {

    public static void main(String[] args) {
    }
}
  • 회의 웹사이트
데이트 사이트에 대한 사용자 데이터베이스를 만들고 있습니다. 하지만 문제는 어떤 순서로 지정해야 하는지 잊어버렸고, 기술 사양도 준비되어 있지 않다는 것입니다. 이름( ), 나이( ), 키( ) User필드가 있는 클래스를 디자인합니다 . 이름, 나이, 키를 순서에 관계없이 지정할 수 있도록 필요한 수의 생성자를 만듭니다. Stringshortint
public class User {

    String name;
    short age;
    int height;

    public static void main(String[] args) {

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