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

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

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



답변

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

@interface MyClass : NSObject

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

@end

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

[MyClass aClassMethod];

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

클래스 메소드의 실제 예는 NSString+stringWithFormat:또는 NSArray‘ 와 같은 많은 Foundation 클래스의 편의 메소드입니다 +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() { ... }
}


답변

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

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

수업 방법

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

인스턴스 메소드

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

답변

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

수업 방법

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

인스턴스 방법

인스턴스 메소드를 사용하여 클래스 전체가 아닌 해당 인스턴스에 고유 한 클래스의 특정 인스턴스를 수정합니다. init예를 들어 ( -전 메소드 선언으로 표시됨)은 인스턴스 메소드입니다 alloc.

NSString *myString = [NSString alloc];

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

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

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


답변

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

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