정적 방식과 인스턴스 방식의 차이
나는 교과서에 나와 있는 본문을 읽고 있었는데 무슨 말인지 잘 모르겠어.기본적으로 정적 메서드 또는 클래스 메서드에 "modifier" 키워드 static이 포함되어 있음을 나타냅니다.근데 그게 무슨 뜻인지 모르겠어요
Static 또는 Class Methods가 무엇인지 정말 간단한 말로 설명해 주실 수 있나요?
또한 Instance 메서드가 무엇인지 간단하게 설명해 주실 수 있을까요?
교과서에 나와 있는 내용입니다.
스태틱 수식어의 유무에는 중요한 실용적인 의미가 있습니다.퍼블릭 클래스 메서드는 Java가 속한 클래스의 정의를 처리하는 즉시 호출되고 실행될 수 있습니다.인스턴스 메서드에는 해당되지 않습니다.퍼블릭 인스턴스 메서드를 호출 및 실행하려면 먼저 해당 인스턴스가 속한 클래스의 인스턴스를 만들어야 합니다.퍼블릭 클래스 방식을 사용하려면 클래스만 있으면 됩니다.한편, 퍼블릭인스턴스 메서드를 사용하려면 클래스의 인스턴스가 있어야 합니다.
스태틱 메서드가 다른 메서드의 정의 내에서 호출되는 방법은 두 메서드가 같은 클래스에 속하는지 여부에 따라 달라집니다.위의 예제에서는 요인 및 주 요인 모두 주 클래스 클래스의 메서드입니다.따라서 주계수의 정의에서 요인 호출은 단순히 방법 이름인 "요인"을 참조합니다.
Java의 기본 패러다임은 사용자가 클래스를 작성하고 이러한 클래스가 인스턴스화된다는 것입니다.인스턴스화된 오브젝트(클래스의 인스턴스)에는 동작에 영향을 주는 속성(멤버 변수)이 관련지어져 있습니다.인스턴스가 메서드를 실행하면 이들 변수를 참조합니다.
단, 특정 유형의 모든 오브젝트는 멤버 변수에 전혀 의존하지 않는 동작을 가질 수 있습니다.이러한 메서드는 스태틱하게 하는 것이 가장 좋습니다.정적이기 때문에 메서드를 실행하기 위해 클래스의 인스턴스가 필요하지 않습니다.
스태틱 방식을 실행하려면 다음 작업을 수행합니다.
MyClass.staticMethod(); // Simply refers to the class's static code
단, 비정적 방식을 실행하려면 다음 작업을 수행해야 합니다.
MyClass obj = new MyClass(); //Create an instance
obj.nonstaticMethod(); // Refer to the instance's class's code
더 깊은 수준에서 컴파일러는 클래스를 결합할 때 메서드에 대한 포인터를 수집하여 클래스에 첨부합니다.이러한 메서드가 실행되면 포인터를 따라 원단에서 코드를 실행합니다.클래스가 인스턴스화되면 생성된 개체에는 상속 계층에서 특정 클래스에 대해 호출되는 메서드를 가리키는 "가상 메서드 테이블"에 대한 포인터가 포함됩니다.단, 메서드가 스태틱한 경우 "가상 메서드 테이블"은 필요하지 않습니다.이 메서드에 대한 모든 콜은 메모리 내의 동일한 위치로 이동하여 동일한 코드를 실행합니다.따라서 고성능 시스템에서는 인스턴스 변수에 의존하지 않는 경우 정적 방법을 사용하는 것이 좋습니다.
static으로 선언되지 않은 메서드 및 변수는 인스턴스 메서드 및 인스턴스 변수라고 합니다.인스턴스 메서드 및 변수를 참조하려면 먼저 클래스를 인스턴스화해야 합니다. 즉, 해당 클래스의 개체를 먼저 만들어야 합니다.static의 경우 클래스를 인스턴스화할 필요가 없으며 (.)에 있는 마침표를 사용하여 클래스 이름으로 메서드와 변수에 액세스할 수 있습니다.
예를 들어 다음과 같습니다.
Person.staticMethod(); //accessing static method.
non-static 메서드의 경우 클래스를 인스턴스화해야 합니다.
Person person1 = new Person(); //instantiating
person1.nonStaticMethod(); //accessing non-static method.
정적 방식과 인스턴스 방식의 차이
인스턴스 메서드는 클래스 개체를 호출하기 전에 생성해야 하는 메서드입니다.정적 메서드는 Java에서 클래스 개체를 만들지 않고 호출할 수 있는 메서드입니다.
static 메서드는 static 키워드로 선언됩니다.인스턴스 메서드에 static 키워드가 없습니다.
정적 메서드는 클래스에 대한 단일 복사본으로 존재하는 메서드를 의미합니다.그러나 인스턴스 메서드는 해당 클래스에 대해 생성된 인스턴스 수에 따라 여러 복사본으로 존재합니다.
정적 메서드는 클래스 참조를 사용하여 호출할 수 있습니다.인스턴스 메서드 또는 비 스태틱메서드는 오브젝트 참조를 사용하여 호출됩니다.
정적 메서드는 인스턴스 메서드와 인스턴스 변수에 직접 액세스할 수 없습니다.인스턴스 메서드는 정적 변수 및 정적 메서드에 직접 액세스할 수 있습니다.
참조: geeksforgeks
정적 메서드, 변수는 개체 인스턴스뿐만 아니라 전체 클래스에 속합니다.정적 메서드, 변수는 클래스의 특정 인스턴스가 아니라 클래스 전체에 관련지어집니다.각 개체는 정적 메서드, 변수의 공통 복사본을 공유합니다.클래스에서 생성된 객체의 수에 관계없이 클래스당 복사본은 1개뿐입니다.
인스턴스 메서드 =>가 특정 클래스의 특정 인스턴스에서 호출됩니다.메서드는 호출된 클래스를 확인하려고 합니다.그것이 일어나는 방식에는 '이것'이라는 보이지 않는 매개 변수가 있습니다.'this' 내부에는 이미 값이 설정된 인스턴스 클래스의 멤버가 있습니다.this'는 변수가 아닙니다.이것은 값이며 변경할 수 없으며 값은 콜의 수신자를 참조합니다.예: TV(실제 프로그램) 수리를 위해 수리공(인스턴스 방법)을 호출합니다.그는 도구('this' 파라미터)를 가지고 온다.그는 TV를 고치는 데 필요한 특정 도구를 가지고 있고 다른 것도 고칠 수 있다.
정적 메서드 =>에는 'this'라는 것이 없습니다.예: 동일한 수리공(정적 방법)그에게 전화를 걸 때는 어떤 수리공을 부를지 지정해야 합니다.그리고 그가 와서 너의 TV만 고쳐줄 거야.그러나 그는 다른 것을 수정할 도구가 없습니다('이' 매개 변수는 없습니다).
정적 메서드는 일반적으로 클래스의 인스턴스('this')에서 데이터를 필요로 하지 않고 인수만 사용하여 의도된 목적을 수행할 수 있는 작업에 유용합니다.
즉, static 메서드와 static 변수는 클래스 수준이며 인스턴스 메서드와 인스턴스 변수는 인스턴스 또는 객체 수준입니다.
즉, 인스턴스 또는 오브젝트(새로운 ClassName()를 사용하여)가 생성될 때마다 이 오브젝트는 인스턴스 변수의 자체 복사본을 유지합니다.동일한 클래스의 다른 객체가 5개 있는 경우 인스턴스 변수의 다른 복사본이 5개 있습니다.단, 스태틱 변수와 메서드는 이들 5개의 오브젝트 모두에 대해 동일합니다.생성된 각 개체에서 공통적으로 사용해야 하는 경우 정적 상태로 만듭니다.오브젝트 고유의 데이터를 필요로 하지 않는 방법이 필요한 경우는, 정적으로 합니다.static 메서드는 static 변수에서만 작동하거나 전달된 인수에 따라 데이터를 반환합니다.
class A {
int a;
int b;
public void setParameters(int a, int b){
this.a = a;
this.b = b;
}
public int add(){
return this.a + this.b;
}
public static returnSum(int s1, int s2){
return (s1 + s2);
}
}
위의 예에서는 add()를 다음과 같이 호출합니다.
A objA = new A();
objA.setParameters(1,2); //since it is instance method, call it using object
objA.add(); // returns 3
B objB = new B();
objB.setParameters(3,2);
objB.add(); // returns 5
//calling static method
// since it is a class level method, you can call it using class itself
A.returnSum(4,6); //returns 10
class B{
int s=8;
int t = 8;
public addition(int s,int t){
A.returnSum(s,t);//returns 16
}
}
첫 번째 클래스에서 add()는 특정 객체에 의해 전달된 데이터의 합계를 반환합니다.그러나 static 메서드는 특정 인스턴스 또는 객체가 있을 경우 독립적이지 않은 모든 클래스에서 합계를 얻기 위해 사용할 수 있습니다.따라서 인수만 기능하는 범용 메서드의 경우 모두 드라이 상태를 유지하기 위해 스태틱하게 만들 수 있습니다.
메서드 상태가 변경되지 않아야 하거나 인스턴스 변수를 사용하지 않아야 하는 경우.
인스턴스 없이 메서드를 호출하는 경우.
제공된 인수에서만 작동하는 경우.
유틸리티 함수는 정적 메서드의 좋은 인스턴스입니다. 즉, math.pow(). 이 함수는 다른 값에 대한 상태를 변경하지 않습니다.그래서 정적이네요.
개체의 동작은 해당 클래스의 변수와 메서드에 따라 달라집니다.클래스를 만들 때 클래스를 위한 개체를 만듭니다.정적 메서드의 경우 정적 메서드는 모든 객체가 동일한 복사본을 가지므로 객체가 필요하지 않습니다.예:
Myclass.get();
인스턴스 메서드에서는 각 오브젝트의 동작이 다르기 때문에 오브젝트인스턴스를 사용하여 메서드를 호출해야 합니다.예:
Myclass x = new Myclass();
x.get();
정적 메서드 vs 인스턴스 메서드
컨스트럭터:
const Person = function (birthYear) {
this.birthYear = birthYear;
}
인스턴스 방식 -> 사용 가능
Person.prototype.calcAge = function () {
2037 - this.birthYear);
}
정적 방법 -> 사용할 수 없음
Person.hey = function(){
console.log('Hey')
}
클래스:
class PersonCl {
constructor(birthYear) {
this.birthYear = birthYear;
}
/**
* Instance Method -> Available to instances
*/
calcAge() {
console.log(2037 - this.birthYear);
}
/**
* Static method -> Not available to instances
*/
static hey() {
console.log('Static HEY ! ');
}
}
함수 앞에 배치되는 정적 수식자는 해당 함수의 복사본이 하나만 있음을 의미합니다.정적 수식자가 함수 앞에 배치되지 않으면 해당 클래스의 모든 개체 또는 인스턴스에 대해 해당 함수의 새 복사본이 만들어집니다.:) 변수도 마찬가지입니다.
언급URL : https://stackoverflow.com/questions/11993077/difference-between-static-methods-and-instance-methods
'itsource' 카테고리의 다른 글
Https Connection Android (0) | 2022.09.03 |
---|---|
JSTL if 동일한 문자열 태그 (0) | 2022.09.03 |
UTC에서 LocalDateTime을 LocalDateTime으로 변환 (0) | 2022.09.03 |
IntelliJ IDEA에서 Maven 종속성 가져오기 (0) | 2022.09.03 |
vue-cli 웹 팩 프로젝트의 웹 팩 구성 파일 위치 (0) | 2022.09.03 |