Objective-C programlama dili, nesne yönelimli programlama yapısına sahip bir dil olarak kullanılmaktadır Bu dilde, sınıf ve nesne tabanlı programlama yapısı kullanılır Bu temel özellikler sayesinde, Objective-C programlama dilinde daha özelleştirilmiş kodlama yapısı oluşturulabilir ve daha iyi performans sağlanabilir Bu yazımızda, Objective-C'nin nesne yönelimli yapısındaki temel özelliklere yer verdik

Objective-C, Apple'ın geliştirme ortamı olan Xcode'da kullanılan bir programlama dilidir. Nesne yönelimli programlama (OOP) konseptine dayalı bir dildir ve nesnelere odaklanarak programlama yapar. Bu yazımızda, Objective-C'nin nesne yönelimli yapısındaki temel özelliklere göz atacağız.
OOP, programlama dünyasında oldukça popüler ve önemli bir konsepttir. Temel olarak, OOP'de program geliştirirken işlem yapmak istediğiniz nesnelere odaklanırsınız. Nesneler, belirli metodlar ve özellikler sahip olan bir sınıftan türetilirler ve ihtiyaçlarınıza göre şekillendirilebilirler.
Objective-C de OOP konseptini ön planda tutar ve sınıflardan türetilen nesneler üzerinde işlemler yapar. Bu sayede program yazmak daha düzenli ve kolay olur. Özellikle Xcode gibi büyük bir geliştirme ortamında, OOP kullanarak kodlama yapmak, kodların daha anlaşılır ve düzenli olmasını sağlar.
Nesne Yönelimli Programlama (OOP)
OOP, programlama dünyasında oldukça önemli bir paradigmadır ve Objective-C gibi nesne yönelimli dillerde kullanılır. OOP, programlamayı nesnelere odaklanarak yapar ve birçok farklı konsepti içerir. Bu konseptlerden bazıları şunlardır:
- Abstraction: Nesnelerin, gerçek dünya öğelerinin soyutlamaları olduğunu ve sadece gerekli özellikleri içermesi gerektiğini ifade eder.
- Encapsulation: Nesnelerin özelliklerinin ve fonksiyonlarının tek bir yerde toplanmasıdır.
- Inheritance: Sınıflar arasında ilişki kurmaya olanak verir. Bu sayede yeni bir sınıf, mevcut bir sınıfın özelliklerini alabilir.
- Polymorphism: Aynı fonksiyonun farklı şekillerde kullanılabilmesine olanak sağlar.
OOP'nin temel konseptleri oldukça önemlidir ve Objective-C'de de oldukça sık kullanılır. Bu konseptleri iyi anlamak, Objective-C'nin nesne yönelimli yapısını daha iyi kavramanızı sağlar. Bu konseptlerin öğrenilmesi aynı zamanda başarılı bir programlamacı olmanın da anahtarlarından biridir.
Sınıflar
Sınıflar, Objective-C'de nesnelerin yapısının temel öğeleridir. Sınıflar, bir nesnenin özelliklerinin tanımlandığı ve bu nesnenin hangi metodlara sahip olduğunun belirtildiği bir prototip olarak düşünülebilir. Sınıflar, nesnelerin neye benzediğini ve ne yapabileceğini tanımlayan bir çerçeve sağlar.
Bir sınıf oluşturmak için, @interface anahtar kelimesi kullanılır. Sınıfın adı bu anahtar kelimeden sonra gelir. Sınıfın yapısını belirtmek için, sınıfın adından sonra süslü parantezler içerisinde özellikler ve metodlar tanımlanır.
Syntax | Açıklama |
---|---|
@interface SınıfAdı : ÜstSınıfAdı | Bir sınıf tanımlar. ÜstSınıfAdı, sınıfın türetildiği sınıfın adıdır (eğer türetildiği bir sınıf yoksa, NSObject kullanılabilir). |
{} | Sınıfın özelliklerini belirtir. |
- (DönüşTipi)metodAdi:(ParametreTipi)parametreAdi; | Bir nesneye ait metod tanımlar. Her metodun bir dönüş tipi, bir adı ve bir ya da daha fazla parametresi olabilir. |
Örneğin, bir Human sınıfı oluşturmak için şu kod kullanılabilir:
@interface Human : NSObject@property (nonatomic, strong) NSString *name;@property (nonatomic, assign) NSInteger age;- (instancetype)initWithName:(NSString *)name age:(NSInteger)age;- (void)sayHello;@end@implementation Human- (instancetype)initWithName:(NSString *)name age:(NSInteger)age { self = [super init]; if (self) { self.name = name; self.age = age; } return self;}- (void)sayHello { NSLog(@"Hello, my name is %@ and I am %li years old.", self.name, (long)self.age);}@end
Bu kodda, Human sınıfı, bir insanın özelliklerini (isim ve yaş) tutan iki özellik ve insanın kendini tanıtmasını sağlayan bir metod içerir. Sınıf, @interface ve @implementation blokları tarafından tanımlanır ve özellikleri ve metodları doğrudan sınıf adından sonra gelir.
Özellikler
Objective-C'de sınıflar özellikler (properties) ile tanımlanır ve bunlar, sınıfın yapısının temelini oluşturur. Bir özelliğin (property) iki bölümden oluşur: biri özelliğin tipi, diğeri ise özelliğin adıdır. Özellik tanımlamaları ise sınıfın arasında yer alır.
Örneğin, bir araba sınıfı için "Marka" ve "Model" özelliklerini tanımlamak isterseniz, aşağıdaki şekilde bir sınıf tanımı yapabilirsiniz:
Sınıf Adı | Marka Özelliği | Model Özelliği |
---|---|---|
Araba | NSString *marka; | NSString *model; |
Yukarıdaki örnek, araba sınıfına "marka" ve "model" özelliklerini ekler. Bu özellikler, her ikisi de NSString tipindedir ve bunların her ikisi de "@property" anahtar kelimesi ile tanımlanmıştır. Bu sayede sınıfın dışında özelliklere erişilebilir ve değerleri değiştirilebilir. Özellikler, sınıfın arasında yer alan {} parantezleri arasına yazılır.
Ayrıca, özelliklerin hafızada saklanması için değişkenlere ihtiyaç vardır. Bu değişkenlere ise "_marka" ve "_model" gibi önekler eklenerek tanımlanır. Bu değişkenler, Objective-C’nin camelCase isimlendirme standardına göre tanımlanmalıdır ve bu sayede özelliklere erişim daha kolay hale gelecektir.
Sentezlenmiş Özellikler
Objective-C 2.0 ile birlikte sentezlenmiş özellikler kullanıma girmiştir. Bu özellikleri kullanarak, sınıfların özelliklerini ve metotlarını açıkça belirleyebiliriz. Sentezlenmiş özellikler, basit bir kodlama yapısı sunarak kullanım kolaylığı sağlarlar. Özellikle, iPhone ve iPad uygulamaları geliştirirken sentezlenmiş özellikler oldukça kullanışlıdır.
Sentezlenmiş özellikleri kullanarak, nesnelerin özelliklerinin kullanımını daha da kolaylaştırabiliriz. Örneğin, bir sınıfın özelliği için bir getter ve setter metodunu açıkça tanımlamak yerine, sentezlenmiş özellikleri kullanarak bu işlemi otomatik hale getirebiliriz. Tablo şeklinde, sentezlenmiş özelliklerin kullanımı aşağıdaki gibidir:
Örnek kod | Anlamı |
---|---|
@property (nonatomic, retain) NSString *adSoyad; | adSoyad adında bir özellik tanımlar. |
@synthesize adSoyad; | adSoyad özelliğini otomatik olarak sentezler. |
Yukarıdaki örnek kod, bir özelliğin sınıf içindeki kullanımını hızlandırır. Özellikle sınıf içindeki özelliklerin otomatik olarak sentezlenmesini sağlar. Bu sayede, daha az kod yazarak daha fazla işlem yapabiliriz.
Özel Özellikler
Objective-C programlama dilinde özellikler (properties), sınıfın yapısına göre özelleştirilebilir ve bunlara özel özellikler (custom properties) denir. Özel özellikler, objenin tam olarak nasıl davranacağını belirler.
Özel özellikler, sınıf tanımlaması içinde tanımlanır ve aynı zamanda özelliklerin erişim düzeylerini de kontrol edebilirler. Erişim düzeyleri public, protected ve private olmak üzere üç şekilde belirlenebilir.
Erişim Düzeyi | Açıklama |
---|---|
Public | Tüm sınıflar tarafından erişilebilir. |
Protected | Sadece sınıfın kendisi ve alt sınıfları tarafından erişilebilir. |
Private | Sadece sınıfın kendisi tarafından erişilebilir. |
Özel özelliklerin tanımlanması için, özelliklerin kapsamı kullanılır. Kapsam belirleyici (scope modifier) anahtar kelimeleri şunlardır:
- @private: Sadece kendi sınıfı tarafından erişilebilir.
- @protected: Kendi sınıfı ve alt sınıfları tarafından erişilebilir.
- @public: Tüm sınıflar tarafından erişilebilir.
- @package: Aynı paketteki sınıflar tarafından erişilebilir.
Özel özelliklerin tanımlanması için örneğin:
@interface MyClass : NSObject { @private int myPrivateVariable; @protected float myProtectedVariable; @public double myPublicVariable; @package int myPackageVariable;}@end
Bu örnekte, private değişken sadece MyClass içinde erişilebilirken, protected değişken MyClass ve potansiyel olarak alt sınıflar tarafından erişilebilir. Public değişken tüm sınıflar tarafından erişilebilirken, paket değişkeni sadece aynı paketteki sınıflar tarafından erişilebilir.
Metodlar
Objective-C'de metodlar, nesneler üzerinde yapılacak işlemleri tanımlar. Bir metod, bir işlemi gerçekleştirir ve bir değer döndürebilir. Metodlar, sınıfın yapısına göre tanımlanır.
Örneğin, bir araba sınıfı tanımlarsak arabanın hızını arttırma ve azaltma gibi işlemlerin metodlarını tanımlamamız gerekir. Aşağıdaki örnek, bir araba sınıfının hızını arttırmak için bir metod tanımlar:
|
Metod tanımının başındaki işaretçi (-), bir instance metodun tanımlandığını gösterir. Metodun adı increaseSpeedBy: şeklinde tanımlanır ve iki noktalı virgül ; karakteri ile sonlanır. Metodun parametresi, parantez içinde NSNumber tipinde bir değer olmalıdır.
Bir nesne üzerinde bir metod çağırmak için, nesne adı ve metodun adı arasına bir nokta koyarak çağırılabilir. Örneğin, bir arabaya increaseSpeedBy: metodunu çağırmak için şu şekilde yazabiliriz:
|
Bu metod çağrısı, myCar adlı bir nesne üzerinde increaseSpeedBy: metodunu çağırır ve hızın 10 artmasına neden olur. Burada NSNumber sınıfından bir parametre kullanıldığına dikkat edin. Bu, metod içinde tamsayı değerini kullanabilmek için gereklidir.
Bir metod, bir değer döndürebilir veya döndürmeyebilir. Eğer bir değer döndürülecekse, metod tanımında dönüş tipi belirtilmelidir.
|
Bu metod, firstName ve lastName özelliklerinin birleştirilmiş halini döndürür. Dönüş tipi NSString olarak tanımlandı, bu nedenle metod tarafından döndürülen değer bir NSString nesnesidir.
Bir sınıf, bir üst sınıftan miras aldığı metodların özelliklerini değiştirebilir. Bu, özelleştirilmiş metodlar olarak adlandırılır.
Örneğin, bir araba sınıfı, bir taşıt sınıfından türetilmiş olabilir. Taşıt sınıfında, increaseSpeedBy: metodunun tanımı olabilir. Araba sınıfı, bu metodun işlevselliğini değiştirebilir:
|
Bu metod, maxSpeed özelliği ile kontrol edilir. Arabanın hızı, maxSpeed özelliğinin değerinden büyükse, metod bir bilgi mesajı gösterir. Aksi halde, taşıt sınıfının increaseSpeedBy: metodunu çağıran super anahtar kelimesi kullanarak üst sınıfın metodunu çağırır.
Bu örnek, Objective-C'de özelleştirilmiş metodların nasıl kullanılabileceğini göstermektedir. Bir sınıf tarafından miras alınan bir üst sınıf metodunun özellikleri, alt sınıflarda değiştirilebilir.
Parametreler ve Döndürülen Değerler
Parametreler ve Döndürülen Değerler
Objective-C'de metodlar, nesneler üzerinde yapılacak işlemleri tanımlar. Bu işlemler sırasında bilgi alışverişi için parametreler kullanılır. Metodlar aynı zamanda bir değer döndürebilir. Bu değeri döndürmek için return ifadesi kullanılır.
Örneğin, bir hesap makinesi uygulamasında toplama işlemi yapan bir metod oluşturmak istiyorsanız, bu metod iki parametre alacak ve sonucu döndürecektir. Aşağıdaki örnek, iki sayının toplamını döndüren bir metod tanımlar:
Metod | Parametreler | Döndürülen Değer |
---|---|---|
Addition | x (int), y (int) | x + y |
Bu metod, int türünde iki parametre alır ve bu iki sayıyı toplar. Toplam sonucunu döndürür. Örnek olarak:
int result = [self Addition:10 y:5];
Bu örnek, 10 ve 5 sayılarını toplayarak sonucu result değişkenine atar.
Metodların kullanımında döndürülen değerlerin türü de önemlidir. Örneğin, bir metodun döndürdüğü değer float türünde olabilir. Bu durumda, return ifadesi için float kullanılmalıdır.
Parametrelerin tipi ve sayısı, metodların işlevselliğini belirler. Metodları doğru şekilde kullanarak, nesneler üzerinde işlemler yapabilir ve sonuçlarını kullanabilirsiniz.
Özselleştirilmiş Metodlar
Objective-C programlama dilinde, bir sınıftan türetilmiş olan sınıfların, üst sınıftaki metodların özelliklerini değiştirerek kendi ihtiyaçlarına göre özelleştirilmesi mümkündür. Bu işleme "özselleştirilmiş metodlar" ya da "override" denir.
Özselleştirilmiş metodlar, Objective-C'nin nesne yönelimli yapısında oldukça önemli bir yer tutar. Temel olarak, bir üst sınıfta bulunan bir metoda yeni özellikler eklemek ya da mevcut özellikleri değiştirmek istediğimizde kullanılırlar.
Bu işlem, alt sınıfta oluşturulacak olan yeni özellikler ya da istenmeyen özelliklerin atlanması gibi durumların da önüne geçer. Özselleştirilmiş metodlar, alt sınıflarda yeni özelliklerin tanımlanmasını ve daha sonra istenildiği zaman üst sınıftaki metodların üzerine yazılmasını mümkün kılar.
Özselleştirilmiş metodların kullanımı oldukça kolaydır ve Objective-C'de oldukça sık kullanılır. Bunun için, öncelikle üst sınıftaki metodu aynen kopyalamalı ve daha sonra bu metodu özelliklerine göre değiştirmelisiniz.
Böylece, üst sınıftaki metodun özellikleri korunurken, alt sınıfta gereksinim duyulan özel özellikler de rahatlıkla tanımlanabilir. Özselleştirilmiş metodlar, Objective-C'deki en güçlü araçlardan biridir ve oldukça yaygın bir şekilde kullanılır.
Miras ve Polimorfizm
Objective-C programlama dilinde, miras ve polimorfizm, sınıfların birbirinden türetilmesi ile ilgilidir. Miras, bir sınıfın özelliklerinin başka bir sınıf tarafından devralınması anlamına gelir. Polimorfizm ise, aynı sınıf veya sınıf hiyerarşisinde yer alan farklı nesnelerin farklı şekillerde davranabilmesidir.
Bir sınıfın başka bir sınıftan türetilmesi işlemine ise İngilizce "inheritance" denmektedir. Türetilmiş sınıf, ana sınıftan aldığı özellikleri taşır ve özelliklerine kendi özelliklerini de ekleyebilir. Bu sayede, aynı özellikleri birden fazla sınıfta tanımlamak yerine, tüm sınıflardan bir ana sınıf türetmek daha mantıklı olabilir. Miras kullanarak, ortak özellikleri olan sınıflar için ortak bir gövde oluşturmak mümkündür.
Polimorfizm, Objective-C'de oldukça önemli bir konsepttir. Sınıfların birbirinden türetilebilmesi, aynı tipteki nesnelerin farklı şekillerde davranabilmesini sağlayarak, kodun daha esnek ve modüler olmasına yardımcı olur. Örneğin, bir "hayvan" sınıfı ve bu sınıftan türeyen "köpek" ve "kedi" sınıfları düşünelim. "Hayvan" sınıfından türeyen nesnelerin, farklı türlerde olduğu durumlarda, aynı metotlarla farklı işlemler yapılması gerekebilir. Polimorfizm sayesinde, bu işlemler farklı şekilde tanımlanabilir ve aynı anda farklı türlerdeki nesnelere uygulanabilir.
Özetle, miras ve polimorfizm nesne yönelimli programlamanın temel kavramlarındandır ve Objective-C'de de sıkça kullanılır. Sınıflar arasındaki ilişkileri belirleyerek, modüler, esnek ve tekrar kullanılabilir kod yazmak mümkündür.
Türetilmiş Sınıflar
Objective-C'de, sınıflar diğer sınıflardan türetilir. Böylelikle, türetilen sınıf, türettiği sınıfın özelliklerini alır ve yeni özellikler ekleyebilir. Türetilmiş sınıflar, temel sınıfın yerine kullanılabilirler ve kodlama açısından oldukça faydalı bir yapıdır.
Türetilmiş sınıfları oluşturmak için, 'subclass' veya 'derived class' terimleri kullanılır. Bir sınıfın altında başka bir sınıf oluşturabilirsiniz ve bu yeni sınıfta, önceden belirlenmiş özelliklere ek olarak, yeni özellikler ekleyerek yaratıcılığınızı kullanabilirsiniz.
Bir sınıftan türetilen yeni bir sınıf oluşturmak için, alt sınıfın adı ve temel sınıfın adı belirtilir. Örneğin:
Türetilmiş Sınıf | Temel Sınıf |
---|---|
iPhone | Telefon |
iPad | Tablet |
Yukarıdaki örnekte, 'iPhone' ve 'iPad' türetilmiş sınıflardır ve 'Telefon' ve 'Tablet' temel sınıflardır. 'iPhone' sınıfı, 'Telefon' sınıfından türerken, 'iPad' sınıfı 'Tablet' sınıfından türer.
Türetilmiş sınıflar, temel sınıfın özelliklerini devraldığı için, kodlama sürecinde son derece faydalıdır. Bu yapı sayesinde, aynı işlemi tekrar tekrar kodlamak yerine, temel sınıfın özelliklerinden yararlanarak, kodlama sürecini hızlandırabilirsiniz.
Polimorfizm
Polimorfizm, Objective-C'nin nesne yönelimli programlama konseptlerinden biridir ve bir nesnenin farklı şekillerde davranabilmesi anlamına gelir. Bu sayede aynı kod blokları, farklı nesneler için farklı şekillerde çalışabilir. Örneğin, bir sınıfın türetilmiş sınıfları aynı metodu kullandıklarında, her sınıfın kendine özgü şekilde çalışmasını sağlayabiliriz.
Bir başka örnek olarak, bir oyunda farklı askerlerin farklı saldırı ve savunma yetenekleri olabilir. Bu durumda, her asker bir nesne olacak ve polimorfizm sayesinde aynı kodları farklı şekillerde çalıştırabileceğiz. Bu sayede kod tekrarından kaçınıp daha temiz ve yönetilebilir bir yapıya ulaşabiliriz.
Polimorfizmin kullanımı için öncelikle türetilmiş sınıfların oluşturulması gerekmektedir. Ardından, bu sınıflarda metodlar türetilmiş sınıfın özelliklerine göre özselleştirilerek kullanılabilir. Bu sayede aynı kod blokları farklı şekillerde çalışabilir ve daha az kod yazarak daha fazla sonuç elde edebiliriz.
Bir başka polimorfizm örneği olarak, bir liste içerisinde farklı nesnelerin bulunması verilebilir. Her nesne farklı bir sınıfa ait olabilir ve aynı metodları kullanmasına rağmen farklı sonuçlar elde edebiliriz. Bu sayede kodlarımızı daha esnek hale getirerek, değişken gereksinimler üzerinde daha kolay çalışabiliriz.