클래스 메서드와 인스턴스 메서드의 차이점은 무엇입니까?
클래스 메서드와 인스턴스 메서드의 차이점은 무엇입니까?
인스턴스 메서드는 접근자(게터 및 세터)이며 클래스 메서드는 그 외의 거의 모든 것입니까?
다른 답변의 대부분과 마찬가지로 인스턴스 메서드는 클래스의 인스턴스를 사용하는 반면 클래스 메서드는 클래스 이름만으로 사용할 수 있습니다.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
그 차이를 이해할 수 있었던 것은 이 설명이었습니다.
클래스 메서드
클래스 메서드는 클래스 전체에 적용됩니다.[ ] 를 alloc
method로 입니다.+
메서드 선언 전.클래스의 특정 인스턴스를 만들기 위해 클래스에 적용되기 때문에 클래스 메서드입니다.
인스턴스 방식
인스턴스 메서드를 사용하여 클래스 전체가 아닌 해당 인스턴스에 고유한 클래스의 특정 인스턴스를 수정할 수 있습니다. 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.class
method는 자신의 모든 작업에 메모리를 할당하고 완료되면 할당을 해제할 것으로 예상됩니다.이는 해당 클래스의 인스턴스가 이전 콜에서 할당된 메모리를 클래스 메서드에 해방할 수 없기 때문입니다.
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
'code' 카테고리의 다른 글
메모장이 다 이긴다고요? (0) | 2023.04.13 |
---|---|
Swift의 iOS 경고에서 TextField에서 입력 값 가져오기 (0) | 2023.04.13 |
Python 사전에 목록 추가 (0) | 2023.04.13 |
Git의 특정 리비전에서 단일 파일을 가져오려면 어떻게 해야 합니까? (0) | 2023.04.13 |
글로벌을 사용하지 않고 bash로 어레이를 반환하려면 어떻게 해야 합니까? (0) | 2023.04.13 |