CodeGym /Java Blog /무작위의 /Java 클래스: 자신만의 클래스 작성, 생성자
John Squirrels
레벨 41
San Francisco

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

무작위의 그룹에 게시되었습니다
안녕! 오늘 우리는 Java의 클래스에 대해 이야기할 것입니다. 클래스가 Java 프로그래밍의 초석을 형성한다고 말할 수 있습니다. 프로그래머가 되면 거의 모든 작업이 다양한 기능을 가진 자신만의 클래스를 작성하게 될 것입니다. 그것이 무엇을 의미하고 어떻게 작동하는지 봅시다. :) 아시다시피 Java는 객체 지향 프로그래밍 언어입니다. 모든 프로그램은 어떤 식으로든 서로 관련된 개체로 구성됩니다. 클래스는 기본적으로 개체의 템플릿입니다. 개체의 모양과 기능을 결정합니다. 모든 개체는 일부 클래스의 개체입니다. 이 매우 간단한 예를 고려하십시오.

public class Cat {

    String name;
    int age;

}
어떤 이유로 고양이와 관련된 프로그램을 작성한다고 가정해 보겠습니다(예: 온라인 계정에 대한 액세스를 제공하는 수의과 진료소가 있음). 우리는 Cat 클래스 를 만들고 그 안에 String nameint age 라는 두 개의 변수를 선언했습니다 . 이러한 멤버 변수를 필드라고 합니다. 본질적으로 이것은 우리가 미래에 만들 모든 고양이를 위한 템플릿입니다. 각 Cat 개체에는 이름과 연령이라는 두 가지 변수가 있습니다.

public class Cat {

    String name;
    int age;

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

        System.out.println("We created a cat named " + smudge.name + ". His age is " + smudge.age);
    }

}
작동 방식은 다음과 같습니다! 우리는 고양이를 만들고 이름과 나이를 지정하고 콘솔에 모두 표시합니다. 케이크 조각. :) 종종 수업은 현실 세계의 사물과 현상을 설명합니다. 고양이, 탁자, 사람, 번개, 책의 페이지, 바퀴 등 개별 클래스를 사용하여 프로그램에서 이 모든 것을 만들 수 있습니다. 지금은 Cat 클래스 에서 선언한 변수에 초점을 맞추겠습니다 . 이를 필드 또는 인스턴스 변수라고 합니다. 그들의 이름은 정말 모든 것을 말해줍니다. Cat 클래스 의 각 인스턴스(또는 개체)에는 이러한 변수가 있습니다. 우리가 만드는 각 고양이는 고유한 이름 변수와 고유한 연령을 갖습니다.변하기 쉬운. 이것은 말이 됩니다. 기본적으로 실제 고양이의 경우와 같습니다. :) 인스턴스 변수 외에도 클래스 변수(정적 변수)도 있습니다. 예제를 마치겠습니다.

public class Cat {

    String name;
    int age;

    static int count = 0;

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

        Cat fluffy = new Cat();
        fluffy.age = 5;
        fluffy.name = "Fluffy";
        count++;

        System.out.println("We created a cat named " + smudge.name + ". His age is " + smudge.age);
        System.out.println("We created a cat named " + fluffy.name + ". His age is " + fluffy.age);

        System.out.println("Total number of cats = " + count);
    }
}
콘솔 출력: Smudge라는 고양이를 만들었습니다. 그의 나이는 3살입니다. 우리는 Fluffy라는 고양이를 만들었습니다. 그의 나이는 5살입니다 고양이의 총 수 = 2 이제 우리 클래스에는 count라는 새로운 변수가 있습니다. 생성된 고양이 수를 세는 역할을 합니다. 메인 에 고양이를 만들 때마다이 변수는 static 키워드를 사용하여 선언됩니다. 즉, 클래스의 특정 객체가 아니라 클래스에 속합니다. 물론 말이 됩니다. 각 고양이의 이름은 특정 고양이에 속하지만 모든 고양이에 적용되는 하나의 고양이 카운터가 필요합니다. 이것이 바로 static 키워드가 수행하는 것입니다. count 변수를 모든 고양이에 대한 단일 변수로 만듭니다. 참고: 변수를 표시할 때 smudge.count 또는 푹신푹신한 카운트를 사용하지 않습니다. Smudge나 Fluffy에 속하지 않습니다. 전체 Cat 클래스 에 속합니다 . 그것이 바로 카운트인 이유입니다. Cat.count를 작성할 수도 있습니다. 그것도 맞을 것입니다. 이름 변수를 표시할 때 다음을 수행하지 않습니다.

public class Cat {

    String name;
    int age;

    static int count = 0;

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

        System.out.println("We created a cat named " + name + ". His age is " + smudge.age);

        System.out.println("Total number of cats = " + count);
    }
}
이것은 오류입니다! 고양이마다 고유한 이름이 있습니다. 컴파일러는 여기서 혼란스러워합니다. "콘솔에 이름 출력? 누구 이름?" :/"

행동 양식

변수 외에도 각 클래스에는 메서드가 있습니다. 이에 대해서는 별도의 단원에서 자세히 설명하겠지만 일반적인 원칙은 매우 간단합니다. 메서드는 클래스의 기능, 즉 클래스의 개체가 수행할 수 있는 작업을 정의합니다. 이러한 메서드 중 하나인 main() 메서드 에 이미 익숙합니다 . 그러나 기억하시겠지만 main 메서드는 정적입니다. 즉, 전체 클래스에 속합니다(로직은 변수와 동일합니다). 그러나 표준 비정적 메서드는 우리가 만든 특정 개체에서만 호출할 수 있습니다. 예를 들어 고양이 클래스를 작성하려면 프로그램에서 고양이가 어떤 기능을 가져야 하는지 알아야 합니다. 이를 전제로 고양이를 위한 몇 가지 방법을 작성해 보겠습니다.

public class Cat {

    String name;
    int age;

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

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

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

        smudge.sayMeow();
        smudge.jump();

    }
}
확인 해봐! 이제 우리 수업은 고양이를 닮은 것에 훨씬 더 가깝습니다! 이제 이름("Smudge")과 나이(3)만 있는 고양이가 아닙니다. 그는 또한 야옹하고 점프할 수 있습니다! 그 "기능"이 없다면 어떤 고양이일까요? :) 특정 객체(smudge)를 가져와서 sayMeow()jump() 메서드를 호출합니다. 콘솔을 보자: 야옹! 급습! 진짜 고양이! :)

나만의 수업 만들기. 추출

앞으로는 자신만의 클래스를 작성해야 합니다. 작성 시 주의할 점은 무엇인가요? 변수에 대해 이야기하는 경우 추상화라는 것을 사용해야 합니다. 추상화는 객체 지향 프로그래밍의 네 가지 기본 원칙 중 하나입니다. 항목의 가장 중요하고 중요한 특성을 추출하고 반대로 사소하거나 중요하지 않은 항목을 버리는 것을 의미합니다. 예를 들어 회사 직원을 위한 서류 캐비넷을 만들어 봅시다. 직원 개체를 만들기 위해 직원을 작성했습니다.수업. 우리 회사의 파일 캐비넷에서 직원의 중요한 특징은 무엇입니까? 이름, 생년월일, SSN 및 직원 ID. 그러나 회사의 직원 기록에 직원의 키, 눈 색깔 또는 머리 색깔이 필요할 가능성은 거의 없습니다. 회사는 이 정보가 필요하지 않습니다. 따라서 Employee 클래스에서 String name , int age , int socialSecurityNumberint employeeId 변수를 선언합니다.. 그리고 눈 색깔과 같은 불필요한 정보는 생략합니다. 즉, 추상화를 만듭니다. 그러나 모델링 에이전시를 위한 파일 캐비닛을 만들면 상황이 극적으로 바뀝니다. 모델의 키, 눈 색깔, 머리 색깔은 중요한 특성이지만 그녀의 SSN은 우리와 전혀 관련이 없습니다. 따라서 Model 클래스에서 String height , String hair , String eyes 변수를 만들어야 합니다 . 이것이 추상화가 작동하는 방식입니다. 쉽습니다! :)

생성자

고양이 예로 돌아가 봅시다.

public class Cat {

    String name;
    int age;

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

        System.out.println("Here the program does something for 2 hours...");

        smudge.age = 3;
        smudge.name = "Smudge";

    }
}
이 코드를 살펴보고 우리 프로그램에 어떤 문제가 있는지 알아내십시오. 우리 프로그램에는 2시간 동안 이름도 나이도 없는 고양이가 있었습니다! 물론 이것은 본질적으로 잘못된 것입니다. 동물 병원의 데이터베이스에는 정보가 없는 고양이가 포함되어서는 안 됩니다. 현재 우리 고양이는 프로그래머의 자비에 있습니다. 우리는 그가 이름과 나이를 지정하는 것을 잊지 않을 것이며 모든 것이 잘 될 것이라고 믿습니다. 그가 잊어버리면 데이터베이스에 이름 없는 고양이라는 문제가 생길 것입니다. 이 문제를 어떻게 해결할 수 있습니까? 고양이가 이름과 나이 없이 생성되는 것을 어떻게든 막아야 합니다. 이것은 생성자가 구출하는 곳입니다. 예를 들어 보겠습니다.

public class Cat {

    String name;
    int age;

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

    public static void main(String[] args) {

        Cat smudge = new Cat("Smudge", 5);
    }
}
기본적으로 생성자는 클래스 개체의 템플릿입니다. 이 경우 각 고양이 개체에 대해 두 개의 인수 Stringint 를 지정해야 함을 나타냅니다 . 지금 이름 없는 고양이를 만들려고 하면 작동하지 않습니다.

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 smudge = new Cat(); // Error!
    }
}
이제 클래스에 생성자가 있으므로 Java 컴파일러는 개체의 모양을 알고 인수를 지정하지 않고 개체를 만들 수 없습니다. 이제 생성자 내부에 표시되는 키워드 this를 조사해 보겠습니다. 너무 간단합니다. 키워드 this는 특정 객체를 나타내기 위한 것입니다. 생성자의 코드

public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
거의 그대로 해석할 수 있습니다. "이 고양이의 이름(우리가 만들고 있는 고양이) = 생성자의 name 매개 변수에 전달된 인수. 이 고양이의 나이(우리가 만들고 있는 고양이) = 생성자의 이름 매개 변수에 전달된 인수 나이 매개변수." 생성자가 실행된 후 필요한 모든 값이 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 smudge = new Cat("Smudge", 5);
        System.out.println(smudge.name);
        System.out.println(smudge.age);
    }
}
콘솔 출력: Smudge 5 생성자가 호출되었을 때:

Cat smudge = new Cat("Smudge", 5);
이것은 실제로 내부적으로 일어난 일입니다.

this.name = "Smudge";
this.age = 5;
그리고 생성자에 전달된 인수의 값은 smudge 개체 에 할당되었습니다 (이 경우 this가 참조하는 것임). 실제로 클래스에서 생성자를 선언하지 않더라도 여전히 생성자를 호출합니다! 그러나 그것이 어떻게 가능합니까? О_О 모든 Java 클래스에는 소위 기본 생성자가 있기 때문입니다. 인수를 사용하지 않지만 모든 클래스의 개체를 만들 때마다 호출됩니다.

public class Cat {

    public static void main(String[] args) {

        Cat smudge = new Cat(); // The default constructor is invoked here
    }
}
언뜻 보면 이것이 명확하지 않을 수 있습니다. 우리는 개체를 만들었습니다. 그래서 무엇입니까? 여기에서 생성자는 어디에서 무엇을 하고 있습니까? 이를 확인하기 위해 Cat 클래스 에 대한 빈 생성자를 명시적으로 작성해 보겠습니다 . 내부에서 콘솔에 문구를 출력합니다. 구가 표시되면 생성자가 호출된 것입니다.

public class Cat {

    public Cat() {
        System.out.println("A cat has been created!");
    }

    public static void main(String[] args) {

        Cat smudge = new Cat(); // The default constructor is invoked here
    }
}
콘솔 출력: 고양이가 생성되었습니다! 확인이 있습니다. 기본 생성자는 항상 클래스에 보이지 않게 존재합니다. 그러나 그것에 대해 한 가지 더 알아야 합니다. 인수를 사용하여 생성자를 생성하면 기본 생성자가 클래스에서 제거됩니다. 사실, 우리는 위에서 이것에 대한 증거를 이미 보았습니다. 이 코드에 있었습니다.

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 smudge = new Cat(); // Error!
    }
}
문자열과 int 매개변수로 Cat 생성자를 선언했기 때문에 이름과 나이 없이 Cat을 만들 수 없습니다 . 이로 인해 기본 생성자가 클래스에서 즉시 사라졌습니다. 따라서 인수가 없는 생성자를 포함하여 클래스에 여러 생성자가 필요한 경우 별도로 선언해야 합니다. 저희 병원은 선행을 하여 이름과 나이를 알 수 없는 노숙자 새끼 고양이를 돕고자 합니다. 그러면 코드는 다음과 같아야 합니다.

public class Cat {

    String name;
    int age;

    // For cats with owners
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // For street cats
    public Cat() {
    }

    public static void main(String[] args) {
        
        Cat smudge = new Cat("Smudge", 5);
        Cat streetCat = new Cat();
    }
}
이제 명시적인 기본 생성자를 지정했으므로 두 유형의 고양이를 모두 만들 수 있습니다. 생성자에서 직접 값을 할당할 수 있습니다. 항상 인수에서 가져갈 필요는 없습니다. 예를 들어 "길고양이 번호 <개수>"를 템플릿으로 사용하여 데이터베이스의 모든 길고양이에 레이블을 지정할 수 있습니다. :

public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat No. " + 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);
    }
}
길고양이 수를 세는 개수 변수가 있습니다 . 기본 생성자가 실행될 때마다 개수를 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 smudge = new Cat("Smudge", 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;
}
이들은 완전히 다른 두 생성자입니다! 이제 몇 가지 작업을 완료하여 자료에 대한 이해를 강화하세요. :)
  1. 고대 박물관.

    귀하의 임무는 Artifact 클래스를 설계하는 것입니다 .
    박물관에는 세 가지 유형의 유물이 보관되어 있습니다.
    박물관에서 할당한 일련 번호(예: 212121)를 제외하고는 첫 번째 유형에 대해 아는 것이 없습니다.
    두 번째 유형의 경우 일련 번호와 이를 만든 문화를 알고 있습니다(예: 212121, "Aztecs").
    세 번째 유형의 경우 일련 번호, 생성 문화 및 생성 세기를 알고 있습니다(예: 212121, "Aztecs", 12).

    박물관에 보관된 유물을 설명하는 Artifact 클래스를 만들고 클래스에 필요한 생성자 집합을 작성합니다. 그런 다음 main() 메서드에서 각 종류의 아티팩트를 하나씩 만듭니다.

    
    public class Artifact {
        
        // Write your code here
    
        public static void main(String[] args) {
            // Write your code here
        }
    }
    
  2. 데이트 웹사이트

    데이트 웹사이트를 위한 사용자 데이터베이스를 만들어 봅시다.
    그러나 여기에 문제가 있습니다. 인수의 필수 순서를 잊어버렸고 사용할 수 있는 기술 문서가 없습니다. 이름( String ), 나이( short ) 및 키( int ) 필드가 있는 User
    클래스를 디자인합니다 . 이름, 연령 및 키를 임의의 순서로 지정할 수 있도록 적절한 수의 생성자를 만듭니다.

    
    public class User {
    
        String name;
        short age;
        int height;
    
        // Write your code here
    
        public static void main(String[] args) {
            
        }
    }
    
배운 내용을 보강하려면 Java 과정에서 비디오 강의를 시청하는 것이 좋습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION