Programming

클래스와 인스턴스 메소드의 차이점은 무엇입니까?

procodes 2020. 2. 17. 22:24
반응형

클래스와 인스턴스 메소드의 차이점은 무엇입니까?


클래스 메소드와 인스턴스 메소드의 차이점은 무엇입니까?

인스턴스 메소드는 접근 자 (getter 및 setter)입니까? 클래스 메소드는 거의 모든 것입니까?


대부분의 다른 답변에서 말했듯이 인스턴스 메소드는 클래스의 인스턴스를 사용하지만 클래스 메소드는 클래스 이름으로 만 사용할 수 있습니다. Objective-C에서는 다음과 같이 정의됩니다.

@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

그런 다음 다음과 같이 사용할 수 있습니다.

[MyClass aClassMethod];

MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];

클래스 메소드의 일부 실제 예는 같은 많은 재단 클래스의 편리한 메소드입니다 NSString+stringWithFormat:또는 NSArray+arrayWithArray:. 인스턴스 메소드는 님 NSArray-count메소드입니다.


모든 기술 세부 사항은 다른 답변에서 잘 설명되었습니다. 클래스와 인스턴스의 차이점을 잘 설명한다고 생각하는 간단한 비유를 공유하고 싶습니다.

여기에 이미지 설명을 입력하십시오

클래스 등이다 청사진 집 : 당신은 단지 하나의 청사진과이 (보통) 당신은 혼자 청사진과 그 정도를 할 수 없습니다.

여기에 이미지 설명을 입력하십시오

(또는 객체 ) 실제입니다 집에 당신이 청사진에 따라 만드는 것이 : 당신은 같은 청사진에서 주택을 많이 구축 할 수 있습니다. 그런 다음 다른 인스턴스에 영향을주지 않고 클래스의 각 인스턴스의 속성을 독립적으로 변경할 수있는 것처럼 각 주택에서 다른 색상으로 벽을 페인트 할 수 있습니다.


다른 답변에서 말했듯이 인스턴스 메소드는 객체에서 작동하고 인스턴스 변수에 액세스 할 수 있지만 클래스 메소드는 클래스 전체에서 작동하며 특정 인스턴스의 변수에 액세스 할 수 없습니다 (인스턴스를 매개 변수).

클래스 메소드의 좋은 예는 클래스의 총 인스턴스 수를 리턴하는 카운터 유형 메소드입니다. 클래스 메서드는로 시작 +하지만 인스턴스 메서드는로 시작 합니다 -. 예를 들면 다음과 같습니다.

static int numberOfPeople = 0;

@interface MNPerson : NSObject {
     int age;  //instance variable
}

+ (int)population; //class method. Returns how many people have been made.
- (id)init; //instance. Constructs object, increments numberOfPeople by one.
- (int)age; //instance. returns the person age
@end

@implementation MNPerson
- (id)init{
    if (self = [super init]){
          numberOfPeople++;
          age = 0;
    }    
    return self;
}

+ (int)population{ 
     return numberOfPeople;
}

- (int)age{
     return age;
}

@end

main.m :

MNPerson *micmoo = [[MNPerson alloc] init];
MNPerson *jon = [[MNPerson alloc] init];
NSLog(@"Age: %d",[micmoo age]);
NSLog(@"%Number Of people: %d",[MNPerson population]);

출력 : 나이 : 0 인원수 : 2

또 다른 예는 사용자가 호출 할 수있는 메소드가 있고 때로는 해당 메소드를 클래스 메소드로 만드는 것이 좋습니다. 예를 들어 MathFunctions라는 클래스가있는 경우 다음을 수행 할 수 있습니다.

+ (int)square:(int)num{ 
      return num * num;
}

따라서 사용자는 다음을 호출합니다.

[MathFunctions square:34];

클래스를 인스턴스화하지 않아도됩니다!

NSArray와 같이 자동 해제 된 객체를 반환하기 위해 클래스 함수를 사용할 수도 있습니다.

+ (NSArray *)arrayWithObject:(id)object

객체를 가져 와서 배열에 넣은 다음 메모리 관리 할 필요가없는 자동 릴리스 버전의 배열을 반환합니다. 임시 배열에는 적합하지 않습니다.

클래스 메소드를 언제 그리고 / 또는 왜 사용해야하는지 이해하기를 바랍니다.


인스턴스 메소드는 클래스의 인스턴스 (즉, 객체)에 적용되는 반면 클래스 메소드는 클래스 자체에 적용됩니다.

C #에서 클래스 메소드는 정적으로 표시됩니다. static으로 표시되지 않은 메소드 및 특성은 인스턴스 메소드입니다.

class Foo {
  public static void ClassMethod() { ... }
  public void InstanceMethod() { ... }
}

나는이 문제를 이해하는 가장 좋은 방법은보고 생각 alloc하고 init. 이 설명을 통해 차이점을 이해할 수있었습니다.

수업 방법

클래스 메소드는 클래스 전체에 적용됩니다. alloc메소드 를 확인하면 +이는 메소드 선언 이전에 표시된 클래스 메소드 입니다. 클래스에 적용되어 해당 클래스의 특정 인스턴스를 만들기 때문에 클래스 메서드입니다.

인스턴스 방법

인스턴스 메소드를 사용하여 클래스 전체가 아닌 해당 인스턴스에 고유 한 클래스의 특정 인스턴스를 수정합니다. init예를 들어 ( -method 선언 이전으로 표시 )은 인스턴스 메소드입니다. 일반적으로로 작성된 클래스의 특성을 수정하기 때문입니다 alloc.

NSString *myString = [NSString alloc];

해당 클래스 alloc의 인스턴스를 생성하기 위해 클래스 메소드 호출하고 있습니다. 메시지 수신자가 어떻게 클래스인지 확인하십시오.

[myString initWithFormat:@"Hope this answer helps someone"];

해당 인스턴스에서 일부 속성을 설정 하여 NSString호출 myString인스턴스를 수정하고 있습니다. 메시지 수신자가 인스턴스 (class의 객체) 인 방법에 주목하십시오 NSString.


귀하의 질문에 대한 답변은 objective-c에만 국한되지는 않지만 다른 언어에서는 클래스 메소드를 정적 메소드라고 할 수 있습니다.

클래스 메소드와 인스턴스 메소드의 차이점은

수업 방법

  • 클래스 변수에서 작동 (인스턴스 변수에 액세스 할 수 없음)
  • 적용하기 위해 인스턴스화 할 객체가 필요하지 않습니다
  • 때로는 코드 냄새가 날 수 있습니다 (OOP를 처음 사용하는 사람들은 OO 환경에서 구조적 프로그래밍을 수행하기 위해 목발로 사용)

인스턴스 메소드

  • 인스턴스 변수 및 클래스 변수에서 작동
  • 작동 할 인스턴스화 된 오브젝트가 있어야합니다

클래스 메소드는 일반적으로 해당 클래스의 인스턴스를 작성하는 데 사용됩니다

예를 들어, 전송 된 매개 변수 [NSString stringWithFormat:@"SomeParameter"];가있는 NSString인스턴스를 반환 합니다. 따라서 유형의 객체를 반환하는 Class 메서드이므로 편의 메서드라고도합니다.


내가 제대로 이해한다면

class방법은 당신이 사용에 해당 개체의 인스턴스를 할당 할 필요가 없습니다 /를 처리합니다. class방법은 자기가 포함 된 해당 클래스의 객체의 상태의 의존없이 작동 할 수 있습니다. class방법이 완료되면 그 클래스의 인스턴스가 클래스 메소드에 대한 이전 호출에 할당 된 메모리를 해제 할 수 없습니다 때문에, 모든 자신의 작업 및 할당 취소에 대한 메모리를 할당 할 것으로 예상된다.

instance방법은 그 반대이다. 해당 클래스의 인스턴스를 할당하지 않으면 호출 할 수 없습니다. 생성자가 있고 소멸자가있을 수있는 일반 클래스와 같습니다 (할당 된 모든 메모리를 정리합니다).

대부분의 경우 재사용 할 수있는 라이브러리를 작성하지 않는 한 class변수 가 필요하지 않습니다 .


인스턴스 메소드는 클래스 인스턴스 (예 : "개체")에서 작동합니다. 클래스 메소드는 클래스와 연관되어 있습니다 (대부분의 언어 static는이 사람들 의 키워드 사용합니다 ).


예를 들어 많은 자동차가 스폰되는 게임을 예로들 수 있습니다. 각각은 클래스 CCar에 속합니다. 자동차가 인스턴스화되면

[CCar registerCar:self]

따라서 CCar 클래스는 모든 CCar의 목록을 인스턴스화 할 수 있습니다. 사용자가 레벨을 완료하고 모든 자동차를 제거하고 싶다고 가정 해 봅시다. 1- 수동으로 작성한 모든 CCar 목록을 살펴보고 whicheverCar.remove();2- 또는 removeAllCars 메소드를 CCar에 추가하십시오. [CCar removeAllCars]에 전화 할 때 allCars[n].remove();

또는 예를 들어 사용자가 시작시로드 및 저장되는 전체 앱의 기본 글꼴 크기를 지정할 수 있습니다. 클래스 메소드가 없으면 다음과 같은 작업을 수행해야 할 수도 있습니다.

fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();

클래스 메소드를 사용하면으로 벗어날 수 있습니다 [FontHandler getDefaultFontSize].

removeVowels 함수와 관련하여 C #과 같은 언어에는 실제로 toLower 또는 toUpper와 같은 특정 방법이 있습니다.

예를 들어, myString.removeVowels()String.removeVowels(myString)(될 것이라고 ObjC에서 [String removeVowels:myString]).

이 경우 인스턴스는 클래스 메소드를 호출 할 수 있으므로 둘 다 사용할 수 있습니다.

public function toLower():String{
  return String.toLower();
}

public static function toLower( String inString):String{
 //do stuff to string..
 return newString;
}

기본적으로, myString.toLower()통화[String toLower:ownValue]

확실한 대답은 없지만 클래스 메서드를 밀어 넣는 것이 코드를 향상시키고 샷을 제공하고 클래스 메서드는 다른 클래스 메서드 / 변수 만 사용할 수 있음을 명심하십시오.


수업 방법

정적으로 선언 된 메소드입니다. 클래스의 인스턴스를 만들지 않고 메서드를 호출 할 수 있습니다. 클래스 메서드는 인스턴스 멤버를 알지 못하기 때문에 클래스 메서드는 클래스 멤버에서만 작동 할 수 있으며 인스턴스 멤버에서는 작동하지 않습니다. 클래스의 인스턴스 메소드는 해당 클래스의 인스턴스에서 호출되지 않는 한 클래스 메소드 내에서 호출 할 수 없습니다.

인스턴스 메소드

반면에 클래스의 인스턴스는 호출되기 전에 존재해야하므로 새 키워드를 사용하여 클래스의 인스턴스를 작성해야합니다. 인스턴스 메소드는 특정 클래스 인스턴스에서 작동합니다. 인스턴스 메소드는 정적으로 선언되지 않습니다.


Objective-C에서 모든 메소드는 "-"또는 "+"문자로 시작합니다. 예:

@interface MyClass : NSObject
// instance method
- (void) instanceMethod;

+ (void) classMethod;
@end

"+"및 "-"문자는 메소드가 각각 class method인지 또는 instance method각각 인지를 지정합니다 .

이 메소드를 호출하면 차이점이 분명합니다. 여기에 메소드가 선언되어 MyClass있습니다.

instance method 클래스의 인스턴스가 필요합니다.

MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];

MyClass다른 메소드 안에서 다음 MyClass사용하는 인스턴스 메소드를 호출 할 수 있습니다 self.

-(void) someMethod
{
    [self instanceMethod];
}

그러나 class methods클래스 자체에서 호출해야합니다.

[MyClass classMethod];

또는:

MyClass* myClass = [[MyClass alloc] init];
[myClass class] classMethod];

작동하지 않습니다.

// Error
[myClass classMethod];
// Error
[self classMethod];

수업 방법


클래스 메소드는 일반적으로 클래스의 새 인스턴스를 작성하거나 클래스의 일부 글로벌 특성을 검색합니다. 클래스 메소드는 인스턴스에서 작동하지 않거나 인스턴스 변수에 액세스 할 수 없습니다.


인스턴스화 방법


인스턴스 메소드는 클래스의 특정 인스턴스에서 작동합니다. 예를 들어, 구현 한 접근 자 메서드는 모두 인스턴스 메서드입니다. 그것들을 사용하여 특정 객체의 인스턴스 변수를 설정하거나 얻습니다.


인보 케


인스턴스 메소드를 호출하려면 메시지를 클래스의 인스턴스로 보냅니다.

클래스 메서드를 호출하려면 메시지를 클래스에 직접 보냅니다.


출처 : IOS-Objective-C-클래스 메소드 및 인스턴스 메소드


클래스 메소드는 인스턴스 변수의 값을 변경하거나 알 수 없습니다. 그것이 인스턴스 메소드가 클래스 메소드가 될 수 있는지를 알기위한 기준이되어야합니다.


또한 동일한 아이디어가 변수에 적용된다는 것을 기억하십시오. 메소드 / 함수와 동일하게 변수에 대해 이야기 할 때 정적, 멤버, 인스턴스, 클래스 등과 같은 용어를 보게됩니다.

Obj-C 커뮤니티에서 일반적인 용어는 예를 들어 변수의 ivar 인 것처럼 보이지만 아직 Obj-C 사람이 아닙니다.


위의 답변에 대한 업데이트는 인스턴스 메소드가 클래스의 인스턴스를 사용하는 반면 클래스 메소드는 클래스 이름으로 만 사용할 수 있음에 동의합니다.

Objective-C에서 자동 참조 카운팅이 발생한 후 인스턴스 메소드와 클래스 메소드 사이에는 더 이상 차이가 없습니다.

예를 들어 [NS StringWithformat:..]클래스 메소드와 [[NSString alloc] initwihtformat:..]인스턴스 메소드는 모두 ARC 후에 동일합니다.


참고 : 이것은 의사 코드 형식입니다

수업 방법

컴파일 타임에 필요한 것은 거의 전부 입니다. 사용자 입력이 필요하지 않으며 계산도 인스턴스를 기반으로합니다. 이에 대한 모든 것은 클래스 / 청사진을 기반으로합니다. 즉, 하나의 클래스에 대해 여러 개의 청사진이 없습니다. 컴파일 시간 동안 다른 변형을 가질 수 있습니까? 따라서 클래스는 고유하므로 클래스 메서드를 몇 번 호출하더라도 포인터를 가리키는 포인터는 동일합니다.

PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes.

인스턴스 방법

이 때문에 반대로 인스턴스 메소드에서 실행하는 동안 발생하는 경우에만 다음 당신이 모든 인스턴스에 따라 달라질 수있는 일의 인스턴스를 만들 었는지.

initWithName: @"John" lastName: @"Doe"Age:12 @"cool"
initWithName: @"Donald" lastName: @"Drumpf"Age:5 attitude:@"He started"
initWithName: @"President" lastName: @"Obama"Age:54 attitude: @"Awesome"
//As you can see the value can change for each instance.

다른 언어에서 오는 경우 정적 메서드는 클래스 메서드와 동일합니다.
Swift에서 온 경우 유형 메소드는 클래스 메소드와 동일합니다.


위의 답변에 추가

클래스 메소드 는 클래스에서 작동합니다. + stringWithFormat, 클래스 크기 및 init 등의 경우 가장 일반적인 용도로 사용합니다.

NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat]; 

인스턴스 메소드 는 두 사람이있는 것처럼 클래스가 아닌 클래스의 인스턴스에서 작동하며 여기서 인스턴스 메소드를 사용해야하는 각각의 균형을 알고 싶습니다. 일반적인 응답을 반환하지 않기 때문입니다. 예를 들어 NSSArray의 개수 등을 결정합니다.

[johnson getAccountBalance];
[ankit getAccountBalance];

참고 URL : https://stackoverflow.com/questions/1053592/what-is-the-difference-between-class-and-instance-methods

반응형