JavaRush /Java Blog /Random-KO /생성자와 일반 메서드의 차이점
fog
레벨 18

생성자와 일반 메서드의 차이점

Random-KO 그룹에 게시되었습니다
생성자는 객체의 필드 값을 초기에 설정하기 위한 특수 메서드입니다. 언뜻 보기에 객체 생성자는 일반 객체 메서드와 크게 다르지 않습니다. 그리고 실제로 생성자 내부에서는 일반 개체 메서드에서 할 수 있는 모든 작업을 수행할 수 있습니다. 즉, 콘솔에 텍스트를 출력하고, 새 개체의 모든 필드와 메서드에 액세스하고, 예외를 발생시키는 등의 작업을 수행할 수 있습니다. 일반 메소드와 마찬가지로 생성자에도 인수가 있을 수 있습니다. 오버로드된 메서드와 마찬가지로 서명이 다른 여러 생성자가 있을 수 있습니다. 일반 메소드와 마찬가지로 생성자는 유형 변수로 매개변수화될 수 있습니다. <init>컴파일러가 생성한 바이트코드를 살펴봐도 생성자에 대한 호출이 있어야 하는 위치에서 다른 메소드에 대한 호출과 다르지 않은 이름의 메소드에 대한 호출을 찾을 수 있습니다. 그 물체. 그리고 이 메소드의 바이트코드를 찾으면 여기에 생성자의 컴파일 결과가 포함되어 있음을 알 수 있습니다. 기존 방법과 크게 다르지 않은 것 같지만 존재하고 상당히 중요한 방법입니다. 먼저, 실제로 생성자가 필요한 이유를 알아 보겠습니다. 기본 유형, 배열, 객체 등 모든 데이터를 저장하고 처리하려면 일정량의 메모리가 필요합니다. 이는 프로세서 레지스터, 스택 공간, 프로세스 데이터 섹션에 할당된 공간 또는 메모리의 동적으로 할당된 부분(힙)일 수 있습니다. 많은 프로그래밍 언어에서 속도 향상을 위해 프로그램이 새로운 메모리 조각을 요청할 때 메모리는 지워지지 않은 프로그램에 제공되며 이전에 이 메모리 셀에 저장되었던 임의의 데이터를 포함할 수 있습니다. 결국 의미있는 데이터 구조가 있도록 필요한 값을 이러한 메모리 조각에 준비하고 쓰는 것은 전적으로 프로그래머의 어깨에 떨어졌습니다. 당연히 프로그래머들은 삶을 더 쉽게 만들고 싶어 자주 사용되는 데이터 구조를 초기화(즉, 초기 값 설정)하는 루틴을 작성했습니다. 이러한 루틴은 거의 지속적으로 사용되었으므로 Java 언어 작성자는 객체를 생성할 때 이러한 초기화 루틴을 필수 호출로 만들기로 결정하고 이를 생성자라고 불렀습니다 . Java에서 새 개체가 생성되면 다음이 발생합니다. 먼저 Java 메모리 관리자가 개체를 수용하는 데 필요한 메모리 양을 할당합니다. 이 경우 생성된 객체의 클래스에 직접 선언된 필드뿐만 아니라 이 클래스의 모든 상위 항목에 선언된 필드도 고려됩니다. 또한 이 볼륨에는 내부 요구에 따라 Java 시스템에서 사용하는 구조를 배치하기 위한 공간이 포함되어 있습니다. 이러한 "공백"의 모든 필드는 참조 null유형, 0숫자 falseboolean. 그 후, 객체 필드의 초기 값을 설정하는 작업을 수행하는 클래스 생성자가 자동으로 호출됩니다. 일반적인 메서드에서 첫 번째 문은 무엇이든 될 수 있지만 생성자의 자유도는 훨씬 낮습니다. 생성자의 첫 번째 문은 동일한 클래스의 다른 생성자에 대한 명시적 호출이거나 부모 클래스의 생성자에 대한 명시적 또는 암시적 호출이어야 합니다. this동일한 클래스의 생성자에 대한 명시적 호출은 키워드 와 괄호로 묶인 인수 집합을 사용하여 수행됩니다 . 부모 클래스의 생성자를 명시적으로 호출하는 것은 정확히 같은 방식으로 수행되지만 키워드가 사용됩니다 super. 동일한 클래스 또는 상위 클래스의 생성자에 대한 명시적 호출의 인수에서는 생성자에 대한 명시적 호출이 정적 컨텍스트를 도입하므로 키워드 및 키워드를 사용할 수 있을 뿐만 아니라 객체의 필드 this및 메서드에 액세스할 수도 없습니다. super상위 클래스의 생성자를 암시적으로 호출하려면 아무것도 작성할 필요가 없지만 기본 생성자가 암시적으로 호출됩니다. 이 생성자는 존재해야 하며 현재 클래스에 표시되어야 합니다. 동시에, 체인 Object상단에 있는 클래스 생성자가 작업을 성공적으로 완료하기 전에 부모 생성자를 호출하는 체인이 중단되면 객체가 종료될 수 없다는 점, 즉 메서드를 명심해야 합니다. finalize()그러한 객체는 절대 호출되지 않습니다. 상위 클래스 생성자가 완료된 후 제어는 암시적으로 현재 클래스의 인스턴스 이니셜라이저 블록과 인스턴스 필드 이니셜라이저로 전달됩니다. 초기화 프로그램은 프로그램 텍스트에 나타나는 순서대로 실행됩니다. 초기화 작업이 완료된 후에야 제어권이 나머지 생성자에게 전달됩니다. 생성자의 나머지 기능은 Java 메모리 모델과 관련됩니다. 클래스 또는 그 조상 중 하나가 메소드를 재정의하는 경우 finalize()생성자의 완료는 메소드가 실행되기 전에( 발생하기 전에finalize() ) 발생합니다 . final생성자가 완료된 후 스레드가 개체에 대한 참조를 본 경우 이 스레드는 생성자가 완료되기 전에 초기화가 발생한 개체의 올바르게 초기화된 필드를 볼 수 있습니다 .
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION