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


답변:


673

대부분의 다른 답변에서 말했듯이 인스턴스 메소드는 클래스의 인스턴스를 사용하는 반면 클래스 메소드는 클래스 이름으로 만 사용할 수 있습니다. 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메소드입니다.


7
좋은 대답입니다. 또한 메소드를 설명하기위한 특정 속기 표기법을 볼 수 있습니다. 예를 들어 + [NSString stringWithFormat :]은 NSString의 클래스 메소드 + stringWithFormat :입니다. -[NSArray objectAtIndex :]는 인스턴스 메소드입니다. 선택기 부분이 여러 개인 메서드는-[NSMutableDictionary setObject : forKey :] 등으로 작성됩니다. Cocoa 응답, 설명서 및 Xcode에서이 표기법을 자주 볼 수 있습니다.
Quinn Taylor

149
다른 많은 언어에서는 클래스 메서드를 "정적"메서드라고합니다. 그리고 원래 질문에 대답하기 위해 접근자는 특정 인스턴스의 상태를 설정하고 가져 오기 때문에 인스턴스 메소드입니다. 위의 예에서 NSArray 개수는 특정 인스턴스의 객체 수를 반환합니다.
Brian Pan

2
"클래스 메소드는 클래스 이름만으로 사용될 수 있습니다." 또는 클래스 객체
user102008

2
흥분해서 미안하지만 ... 그 차이와 그 잠재력을 알게되었습니다. 클래스 메소드는 락과 싱글턴 클래스도 마찬가지입니다! 내가 사랑에 빠졌다! <3
Pavan

2
@BrianPan 정적 및 클래스 메소드는 동일하지 않습니다. 그것들은 비슷하지만 다르게 이름이 붙여지는 이유는 다르게 작동하기 때문입니다. 예를 들어 정적 메서드는 재정의 할 수 없습니다.
Sulthan

190

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

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

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

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

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


6
@JohannesFahrenkrug 여기에서 클래스와 객체에 대한 개념을 멋지게 설명했습니다. 실제 질문은 아닙니다 difference between class method and an instance method .
Shekhu

1
클래스 대 클래스의 완벽한 설명. 수업은 초보자에게는 이상한 개념이며 가장 기본적인 방법으로 설명합니다.
Alex McPherson

1
@JohannesFahrenkrug 정말 좋은 설명으로, 어떻게 r diff와 두 가지를 모두 사용할지 생각하게되었습니다.
ChenSmile

1
위대한 설명 :)
Praveenkumar

1
좋은 비유입니다. 누군가이 사람에게 1 년 동안 피자를 공급해주세요.
GeneCode

102

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

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

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

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

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


1
micmoo, "static int numberOfPeople = 0;" 코드 형식의 텍스트로? 샘플 코드 위에 나타날 때까지 혼란 스러웠습니다. 그 외에는 정말 간결한 답변입니다.
mobibob 2019

2
초보자 혼동을 용서하지만 왜 인스턴스 변수 "age"와 인스턴스 메소드 "age"가 모두 필요한가요? @synthetize로 예를 들어 변수 "age"에 대한 getter 및 setter를 작성하지 않습니까?
selytch

@selytch "age"는 합성을 사용하기 위해 속성으로 정의되어야합니다.
micah94

36

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

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

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

1
Argh-죄송합니다. 이것이 Obj-C 질문이라는 것을 알았습니다. 바라건대 내 대답은 여전히 ​​적용되지만 투표하거나 삭제하여 투표하십시오.
Robert Horvick 2016 년

6
아무런 해가 없습니다. 답의 첫 부분은 일반적인 OOP 원칙으로 정확하며 Objective-C에 확실히 적용됩니다. 참여를 환영하지만 이러한 질문을보고 싶지 않으면 무시하기 위해 태그 목록에 "objective-c"를 추가 할 수 있습니다. :-)
Quinn Taylor

16

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

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

수업 방법

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

인스턴스 메소드

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

인스턴스 메소드는 클래스 변수에서 작동 할 수 있습니까?
蘇健豪

16

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

수업 방법

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

인스턴스 방법

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

NSString *myString = [NSString alloc];

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

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

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


"alloc"방법을 확인한다는 것은 무슨 뜻입니까? 문서의 특정 장소를 알려 주시겠습니까? NSObject 문서에서 "Tasks"아래에 developer.apple.com/library/ios/documentation/cocoa/reference/…
Ethan Parker

실제로 이것을 이해하기 위해 무엇을하는지 이해할 필요가 없으며 단지 수업에 적용됩니다. 간단히 말해서 : alloc객체에 충분한 메모리를 할당 init하고 해당 메모리 주소에있는 내용을 수정하여 객체의 상태를 정의합니다. 객체를 수정할 공간이 없으면 객체를 수정할 수 없으므로 alloc클래스에서 해당 공간을 제공하도록 결정합니다.
Adam Waite

6

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

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


6

내가 제대로 이해한다면

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

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

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


1
클래스 메소드가 필요한 명백한 경우는 인스턴스 작성입니다. 인스턴스가 없어도 인스턴스를 만들 수 있어야합니다. 그렇지 않으면 첫 번째 인스턴스를 만들 수 없습니다. 그렇기 때문에 + alloc은 클래스 메서드 여야합니다.
gnasher729

4

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


3

예를 들어 많은 자동차가 스폰되는 게임을 예로 들어 보겠습니다. 자동차가 인스턴스화되면

[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]

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


3

수업 방법

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

인스턴스 메소드

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


"new"뿐만 아니라 "alloc"키워드를 사용하여 만들 수도 있습니다. 또한 Objective-C는 인스턴스 메소드를 호출하기 위해 인스턴스가 필요하지 않으므로 널 포인터에 메시지를 보낼 수 있습니다.
Elviss Strazdins

3

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];

3

수업 방법


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


인스턴스 방법


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


인보 케


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

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


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


1

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


-1 : 클래스 메소드에 인스턴스를 전달할 수 있고 변수 값을 변경하고 알 수 있기 때문에.
Elviss Strazdins

1

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

Obj-C 커뮤니티에서 일반적으로 사용되는 용어는 예를 들어 변수 인 ivar 인 것 같습니다. 그러나 아직 Obj-C 사용자는 아닙니다.


1

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

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

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


1

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

수업 방법

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

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


0

위의 답변에 추가

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

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

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

[johnson getAccountBalance];
[ankit getAccountBalance];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.