code

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

starcafe 2023. 4. 13. 21:00
반응형

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

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

인스턴스 메서드는 접근자(게터 및 세터)이며 클래스 메서드는 그 외의 거의 모든 것입니까?

다른 답변의 대부분과 마찬가지로 인스턴스 메서드는 클래스의 인스턴스를 사용하는 반면 클래스 메서드는 클래스 이름만으로 사용할 수 있습니다.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★★★★★★ 。

모든 기술적인 세부 사항은 다른 답변에서 잘 다루어져 있습니다.클래스와 인스턴스의 차이를 잘 보여주는 간단한 비유를 하나 들어보겠습니다.

여기에 이미지 설명 입력

클래스는 집의 청사진과 같습니다.Blueprint는 1개뿐이며 일반적으로 Blueprint만으로는 많은 작업을 수행할 수 없습니다.

여기에 이미지 설명 입력

인스턴스(또는 개체)는 Blueprint를 기반으로 빌드하는 실제 하우스입니다.당신은 같은 청사진으로 많은 집을 지을 수 있다.그런 다음 다른 인스턴스(instance)에 영향을 주지 않고 클래스의 각 인스턴스(instance) 특성을 독립적으로 변경할 수 있는 것처럼 각 주택에서 벽을 다른 색으로 칠할 수 있습니다.

다른 답변과 마찬가지로 인스턴스 메서드는 객체 상에서 동작하며 인스턴스 변수에 액세스할 수 있는 반면 클래스 메서드는 클래스 전체에서 동작하며 특정 인스턴스의 변수에 액세스할 수 없습니다(인스턴스를 매개 변수로 전달하지 않는 한).

클래스 메서드의 좋은 예로는 클래스의 인스턴스 수를 반환하는 카운터형 메서드가 있습니다.은 먼저 '수업' a로 합니다.+는 예시로 합니다.- §:

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으로 표시됩니다.static 마크가 붙어 있지 않은 메서드 및 속성은 인스턴스 방식입니다.

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

질문에 대한 답변은 목적 c에만 해당되지 않지만 다른 언어에서는 클래스 메서드를 정적 메서드라고 할 수 있습니다.

클래스 메서드와 인스턴스 메서드의 차이는 다음과 같습니다.

클래스 메서드

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

인스턴스 방식

  • 인스턴스 변수 및 클래스 변수에 대해 작업
  • 작업할 설치 개체가 있어야 합니다.

을 하는 가장 은 을 합니다.alloc ★★★★★★★★★★★★★★★★★」init그 차이를 이해할 수 있었던 것은 이 설명이었습니다.

클래스 메서드

클래스 메서드는 클래스 전체에 적용됩니다.[ ] 를 allocmethod로 입니다.+메서드 선언 전.클래스의 특정 인스턴스를 만들기 위해 클래스에 적용되기 때문에 클래스 메서드입니다.

인스턴스 방식

인스턴스 메서드를 사용하여 클래스 전체가 아닌 해당 인스턴스에 고유한 클래스의 특정 인스턴스를 수정할 수 있습니다. init를 들어 (「」(「」)가 )-은입니다.후을 보통 입니다.이는 클래스가 작성된 후 해당 클래스의 속성을 보통 수정하기 때문입니다.alloc.

NSString *myString = [NSString alloc];

메서드를 클래스 메서드라고 .alloc해당 클래스의 인스턴스를 생성하기 위해 사용합니다.메시지의 수신자가 클래스인 것에 주의해 주세요.

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

.NSString라고 하는myString해당 인스턴스에 몇 가지 속성을 설정함으로써 이루어집니다.인에 주의해 주세요.NSString를 참조해 주세요.

클래스 메서드는 보통 해당 클래스의 인스턴스를 만드는 데 사용됩니다.

를 들어, 「」라고 하는 것은,[NSString stringWithFormat:@"SomeParameter"];NSString합니다.따라서 해당 유형의 객체를 반환하는 Class 메서드이므로 편의 메서드라고도 합니다.

그래서 내가 제대로 이해했다면.

A class메서드는 해당 개체를 사용하거나 처리하기 위해 해당 개체의 인스턴스를 할당할 필요가 없습니다. a.class메서드는 자체 억제되며 해당 클래스의 오브젝트 상태에 의존하지 않고 작동할 수 있습니다. a.classmethod는 자신의 모든 작업에 메모리를 할당하고 완료되면 할당을 해제할 것으로 예상됩니다.이는 해당 클래스의 인스턴스가 이전 콜에서 할당된 메모리를 클래스 메서드에 해방할 수 없기 때문입니다.

A instance방법은 정반대입니다.해당 클래스의 인스턴스를 할당하지 않으면 호출할 수 없습니다.이것은 컨스트럭터가 있고 디스트럭터(할당된 모든 메모리를 정리하는)를 가질 수 있는 일반 클래스와 같습니다.

한 라이브러리를 한)는 필요 .class★★★★★★ 。

인스턴스 메서드는 클래스의 인스턴스(즉, "개체")에서 작동합니다.클래스와 에서는 키워드를 합니다).static★★★★★★★★★★★★★★★★★★★★★★★」

예를 들어, 자동차가 많이 생산되는 게임을 예로 들어보자.각각 CCar 클래스에 속합니다.자동차가 인스턴스화되면 콜을 발신한다.

[CCar registerCar:self]

따라서 CCar 클래스는 인스턴스화된 모든 CCar 목록을 만들 수 있습니다. 하나를 할 수 있습니다. 수동으로 목록을 하고 CCAR을 수행합니다.whicheverCar.remove();「2-CCar」의 remove AllCars.[ CCAR remove AllCars ]는 CCAR remove AllCars입니다.allCars[n].remove();

또는 시작 시 로드 및 저장되는 전체 앱의 기본 글꼴 크기를 지정할 수 있습니다.수업 방식이 없다면 다음과 같은 작업을 해야 할 수 있습니다.

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

방식을 하면, ' 방식 '클래스 방식'으로 빠져나갈 수 있습니다.[FontHandler getDefaultFontSize].

removeVowels 함수에 대해서는 C#과 같은 언어에는 실제로 ToLower와 ToUpper와 같은 특정 메서드가 있습니다.

★★myString.removeVowels() ★★★★★★★★★★★★★★★★★」String.removeVowels(myString)에서는 (ObjC c 음 음 음 음 음 음 ( ( ( ( ( ( ( ( ( 。[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];
}

렇지 but but , but 。class methods클래스 자체를 호출해야 합니다.

[MyClass classMethod];

또는 다음 중 하나를 선택합니다.

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

이렇게 하면 안 돼요.

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

클래스 메서드


클래스 메서드는 일반적으로 클래스의 새 인스턴스를 만들거나 클래스의 일부 글로벌 속성을 가져옵니다.클래스 메서드는 인스턴스에서 작동하지 않거나 인스턴스 변수에 액세스할 수 없습니다.


인스턴스 방식


인스턴스 메서드는 클래스의 특정 인스턴스에서 작동합니다.예를 들어 구현한 접근자 방식은 모두 인스턴스 방식입니다.특정 객체의 인스턴스 변수를 설정하거나 가져올 때 사용합니다.


기동하다


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

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


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

클래스 메서드는 인스턴스 변수의 값을 변경하거나 알 수 없습니다.인스턴스 메서드가 클래스 메서드가 될 수 있는지 여부를 확인하는 기준이 되어야 합니다.

또한 변수에도 동일한 아이디어가 적용됩니다.메서드/함수와 마찬가지로 변수에 대해 이야기할 때 static, member, instance, class 등의 용어를 사용할 수 있습니다.

Obj-C 커뮤니티에서는 예를 들어 ivar가 일반적인 용어인 것 같습니다만, 저는 아직 Obj-C가 아닙니다.

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

Objective-C에서 자동 참조 카운트가 존재하게 된 후 인스턴스 메서드와 클래스 메서드는 더 이상 차이가 없습니다.

를 들어, 「」를 참조해 주세요.[NS StringWithformat:..] 방법 및 클래스 방법[[NSString alloc] initwihtformat:..] 방식,둘 다 ARC 뒤에하다.

주의: 이것은 의사 코드 형식일 뿐입니다.

클래스 방식

컴파일 시간 동안만 하면 됩니다.사용자 입력이 필요하지 않으며 인스턴스(instance)를 기반으로 계산됩니다.이 모든 것은 클래스/블루프린트를 기반으로 합니다.이것은, 1개의 클래스에 복수의 Blueprint가 없는 독특한 것입니다.컴파일 시간 동안 다른 변화를 줄 수 있나요?아니요. 따라서 클래스는 고유하기 때문에 클래스 메서드를 몇 번 불러도 포인터가 가리키는 것은 동일합니다.

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에서 온 경우 type methods는 클래스 메서드와 동일합니다.

위의 답변에 추가

클래스 메서드는 클래스에서 동작합니다.이 메서드는 +stringWithFormat, 클래스의 크기, 그리고 가장 중요한 init 등의 일반적인 목적으로 사용합니다.

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

Instance Method는 2명이 있는 것과 같은 클래스가 아닌 클래스의 인스턴스에서 동작합니다.인스턴스 메서드를 사용할 필요가 있는 각 클래스의 밸런스를 개별적으로 알고 싶습니다.NSSAray 카운트 등의 일반적인 응답을 반환하지 않기 때문입니다.

[johnson getAccountBalance];
[ankit getAccountBalance];

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

반응형