Kotlin’de Nesne Yönelimli Programlama (1)

Kotlin’de Nesne Yönelimli Programlama (1)

Herkese merhabalar. Bugün Kotlin serimizin son adımı olan nesne yönelimli programlama ve kavramlarına değineceğiz. Nesne yönelimli programlamada temel amaç kod karmaşıklığını azaltmak ve kodun yazımını kolaylaştırmaktır. Kavramlardan bahsetmeden önce kısaca nesne yönelimli programlamanın ne olduğunu anlamaya çalışalım. Nesne yönelimli programlama (Object Oriented Programming), nesnelere (object) ve nesneler üzerinden yapılacak işlemlere odaklanır. Örneğin bir arabanın renginin, fiyatının ya da modelinin bilgisayar ortamına aktarılması nesne yönelimli programlamaya örnektir. Diğer bir deyişle nesnenin kendisine ait özelliklerini kullanmamıza olanak sağlayan bir dil modelidir.

Şimdi detaylıca nesne yönelimli programlamanın kavramlarına göz atalım.

Class

Sınıflar (class) nesne yönelimli programlamanın temelini oluştururlar. Nesnelerin özellikleri ve davranışları ile ilgili ayrıntılar bu yapıda tutulur. Her sınıf nesne üzerinde çalışmak için özellikler ve yöntemler içerir. Sınıf ve nesne birbirine bağlıdır ve her nesnenin bir sınıfı olmak zorundadır. Örnekle açıklayacak olursak, bir araba sınıfımız olduğunu varsayalım. Bu araba sınıfı bazı özellikler ve metotlar içeriyor. Bu sınıftan bir nesne türetebiliriz. Nesnemiz araba sınıfında tanımladığımız her özelliğe ve yönteme erişebilir durumdadır.

Arabanın rengini, modelini ve arabanın satılık olup olmadığının bilgisini tutan bir sınıf tanımlayalım. Aynı zamanda bu sınıf bir metot da içersin.

Sınıfı tanımlamak için class anahtar sözcüğünü kullandık ve ardından sınıfa bir isim verdik. Gövde kısmında ise bazı değişkenler tanımladık ve onlara değerler atadık. Bu sınıftan bir nesne oluşturmak istediğimizde artık bu değişkenlere erişebileceğiz.

Constructors

Yapıcı metotlar bir sınıftan nesne türetirken o nesneye başlangıç değeri verilmesine olanak tanır. Kotlin’de bir sınıf primary constructor ve bir ya da birden fazla secondary constructor‘a sahip olabilir.

Yukarıda oluşturduğumuz Car sınıfını giriş parametresi alacak şekilde düzenleyelim.

Car sınıfımızı düzenledik ve parametreler ekledik. Bu parametrelere ise main.kt dosyasında erişim sağladık. İkinci kodun çıktısı şu şekilde olur:

Color: Black
Model: 2016
Is for Sale: false

Sınıflar default (varsayılan) parametrelere sahip olabilir. Fonksiyonlardan bahsettiğimiz yazıda default parametrelerin nasıl kullanıldığını görmüştük. Aynı şekilde bunu constructorlara da uyarlayabiliriz. Bu şu anlama gelmektedir; sınıftan bir nesne türetildiğinde varsayılan değerler belirtilmek zorunda değildir. Car sınıfımızda ufak bir değişiklik yaparak model parametresini default parametre yapalım.

Primary Constructor

Primary constructor direkt sınıf tanımlanırken sınıf adının yanında, sınıf içerisindeki değişkenlere başlangıç değeri atamak için kullanılır.

Teknik olarak ilk kod bloğu ile ikinci kod bloğu aynıdır. Fakat biz Kotlin’de ilk kod bloğunu daha yaygın olarak kullanıyoruz.

Initializer Block

Kotlin’de primary constructor içine kod yazamayız. Bu yüzden kod yazmak için init bloklarını kullanırız. Sınıf içerisinde birden fazla init bloğu olabilir ve kodlar sırasıyla yürütülür. Aynı zamanda init bloğu, primary constructor’ın gövdesi konumundadır. Bir örnekle göz atalım.

İlk kod bloğunda giriş parametresine sahip bir sınıfımız var. Constructor içinde çalışmak istediğimiz için bir init bloğu oluşturduk ve içine bir ifade yazdık. Bu sınıftan bir nesne türetildiğinde (ikinci kod bloğu) kod yürütüldüğü anda init bloğu çalışır ve println ifadesi çıktımız olur.

Secondary Constructor

Bir secondary constructorı tanımlarken constructor anahtar sözcüğünü kullanırız. Secondary constructor this anahtar kelimesini kullanan bir primary constructor çağırmalıdır. Bunun yerine primary constructorı çağıran başka bir secondary constructorı da çağırabilir.

Calculate sınıfının içinde bir primary constructorımız var. Giriş olarak double tipinde bir radius değişkeni tutuyor. İki tane de secondary constructorımız var. Birden çok constructora sahip sınıflarda init bloğu, secondary constructorlardaki herhangi bir koddan önce çalışacaktır. Bu yüzden çıktı olarak ilk önce println ifadesini görürüz.

Getters ve Setters

Getter ve Setter her sınıf özelliği için varsayılan olarak oluşturulur ve özelliklere erişmemizi sağlar. Kotlin var anahtar kelimesiyle tanımlanmış değerler için otomatik olarak get ve set metotları oluşturur fakat val anahtar kelimesiyle tanımlanan değişkenler sadece okunur durumdadır. Bu yüzden bu değişkenler için set metodu oluşturulmaz. Kod formatı ise şu şekildedir:

field anahtar kelimesi değişkeni (name) temsil etmektedir. Value ise değişkene atanacak değer için kullanılır. Value yerine başka bir kelime de kullanabiliriz. Bu metotlar Kotlin’de varsayılan olarak bulunduğu için özelleştirilmiş halleri dışında kullanımları gerekli değildir.

Custom Getter ve Setter

Bir sınıfın içinde özelleştirilmiş getter ve setter metotları kullanabiliriz.

Parametre olarak belirttiğimiz ad ve soyad değişkenini birleştiren özel bir get metodu tanımladık. Burada fullName’e özellik gibi erişim sağlayabiliriz ve get() metodu yürütülür. Şimdi de özelleştirilmiş setter metoduna göz atalım.

Bir Student sınıfının içinde özel get ve set metotları oluşturduk. Her metodun içine ise bu metodun çalıştığına dair ibareler ekledik. Main fonksiyonu çalıştırıldığında kodumuzun çıktısı şu şekilde olacaktır:

set method

first get method

second get method

Damla’s grade is 89

Sınıfın içerisinde ilk önce set metodu işleme alındı. Set metodunda koda, değişkene atanacak değerin uzunluğunun ikiden küçük olması halinde name’in (field) geçersiz olacağını söyledik. Sonrasında ise ilk get() metodumuz çalıştı ve ismi string tipinde döndürdü. Son olarak ise ikinci get() metodumuz çalıştı ve grade değişkenine özellik olarak erişebilmemiz sağlandı. Main fonksiyonunda Student sınıfından bir student nesnesi oluşturduk ve “.” operatörü kullanarak name değişkenine bir isim atadık. Sonrasında ise bunları ekrana yazdırdık.

Bu yazıda sınıf, nesne, constructor ve getter/setter metotlarına değinmiş olduk. Sonraki yazımızda ise kalıtım (inheritance), extension function ve special classes konularına değineceğiz. Nesne yönelimli programlamanın ikinci yazısında görüşmek üzere, hoşça kalın.

Damla Çim

Ben Damla Çim. Bolu Abant İzzet Baysal Üniversitesi'nde Bilgisayar Mühendisliği okuyorum. Hobi olarak sokak fotoğrafçılığı ile ilgileniyorum ve boş zamanlarımda yazılım sektöründe kendime seçtiğim alan doğrultusunda blog yazıları yazıyorum.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir