클래스
// Man이라는 클래스를 정의합니다.
class Man {
// 나이를 나타내는 정수형 변수 age를 선언하고 초기값으로 1을 할당합니다.
var age : Int = 1 // stored property
// 몸무게를 나타내는 실수형 변수 weight를 선언하고 초기값으로 3.5를 할당합니다.
var weight : Double = 3.5 // stored property
// display라는 함수를 정의합니다. 이 함수는 인스턴스의 나이(age)와 몸무게(weight)를 출력합니다.
func display() {
// print 함수를 사용하여 나이(age)와 몸무게(weight)를 출력하는데,
// 이때 문자열 내에서 변수값을 출력하기 위해 \(변수명) 문법을 사용합니다.
print("나이=\(age), 몸무게=\(weight)")
}
}
클래스의 기본적인 구조이다.
// 'Man' 클래스를 정의합니다.
class Man {
// 'age'라는 이름의 인스턴스 변수를 정의하고, 초기값으로 1을 할당합니다. 이 변수는 정수형 타입(Int)을 가집니다.
var age : Int = 1
// 'weight'라는 이름의 인스턴스 변수를 정의하고, 초기값으로 3.5를 할당합니다. 이 변수는 실수형 타입(Double)을 가집니다.
var weight : Double = 3.5
// 'display'라는 이름의 함수(메서드)를 정의합니다. 이 메서드는 클래스의 인스턴스 변수인 'age'와 'weight'의 현재 값을 출력합니다.
func display() {
// 'print' 함수를 사용하여 "나이=age값, 몸무게=weight값" 형식으로 콘솔에 출력합니다.
// 여기서 '\(변수명)' 문법을 사용하여 문자열 내에 변수의 값을 포함시킵니다.
print("나이=\(age), 몸무게=\(weight)")
}
}
// 'x'라는 이름의 변수를 정의하고, 초기값으로 1을 할당합니다.
var x = 1
// 'x' 변수의 값을 10으로 변경합니다.
x = 10
// 'Man' 클래스의 인스턴스를 생성하고, 이를 'kim'이라는 변수에 할당합니다.
var kim = Man()
// 'kim' 인스턴스의 'age' 속성(변수) 값을 출력합니다. 초기값은 1입니다.
print(kim.age)
// 'kim' 인스턴스의 'weight' 속성(변수) 값을 출력합니다. 초기값은 3.5입니다.
print(kim.weight)
// 'kim' 인스턴스의 'display' 메서드를 호출합니다. 이 메서드는 인스턴스의 'age'와 'weight' 값을 출력합니다.
kim.display()

static 메서드를 호출하려고 했더니 호출할 수가 없었다.
인스턴스에서 static 메서드를 호출하려고 했기 때문이다.

클래스를 통해 바로 호출하면 해결할 수 있다.

클래스 메서드도 동일하게 인스턴스에서 사용하려고 했더니 오류가 발생했다.

같은 방법으로 해결했다.

class 키워드로 만든 클래스는 자식 클래스에서 override 할 수 있다.
class Man {
var age : Int
var weight : Double
init() {
age = 1
weight = 3.5
}
func display() {
print("나이=\(age), 몸무게=\(weight)")
}
}
var kim = Man() // Man.init()
클래스가 정상적으로 동작하기 위해서 프로퍼티의 초기값을 설정하는 방식이 세 가지가 있는데 그 중 하나가 init() 생성자를 사용하는 것이다.
class Man {
var age : Int
var weight : Double
init(a : Int, w : Double) {
age = a
weight = w
}
func display() {
print("나이=\(age), 몸무게=\(weight)")
}
}
var kim = Man(a: 1, w: 2.5)
kim.display()
var kim1 = Man(a: 2, w: 5.5)
kim1.display()
생성자에서 매개변수를 받아 초기화를 할 수 있다.
class Man {
var age : Int
var weight : Double
init(age : Int, weight : Double) {
self.age = age
self.weight = weight
}
func display() {
print("나이=\(age), 몸무게=\(weight)")
}
}
생성자에서 매개변수를 받는데 프로퍼티명과 같을 경우 self라는 키워드를 이용해서 같은 이름으로 사용할 수 있다.


// 'Man' 클래스를 정의합니다.
class Man {
// 'age'라는 이름의 변수를 정의합니다. 이 변수는 정수형 타입(Int)을 가집니다.
var age : Int
// 'weight'라는 이름의 변수를 정의합니다. 이 변수는 실수형 타입(Double)을 가집니다.
var weight : Double
// 클래스의 인스턴스가 생성될 때 호출되는 초기화 메서드(init)를 정의합니다.
// 이 메서드는 'age'와 'weight'라는 두 매개변수를 받아들입니다.
init(age : Int, weight : Double) {
// 인스턴스의 'age' 변수에 매개변수로 받은 'age' 값을 할당합니다.
self.age = age
// 인스턴스의 'weight' 변수에 매개변수로 받은 'weight' 값을 할당합니다.
self.weight = weight
}
// 'display'라는 이름의 함수(메서드)를 정의합니다. 이 메서드는 클래스의 인스턴스 변수인 'age'와 'weight'의 현재 값을 출력합니다.
func display() {
// 'print' 함수를 사용하여 "나이=age값, 몸무게=weight값" 형식으로 콘솔에 출력합니다.
print("나이=\(age), 몸무게=\(weight)")
}
}
// 'Man' 클래스의 인스턴스를 생성하고, 이를 'kim'이라는 변수에 할당합니다.
// 이때, 초기화 메서드(init)에 'age' 값으로 1, 'weight' 값으로 2.5를 전달합니다.
var kim = Man(age: 1, weight: 2.5)
// 'kim' 인스턴스의 'display' 메서드를 호출합니다. 이 메서드는 인스턴스의 'age'와 'weight' 값을 출력합니다.
kim.display()
// 'Man' 클래스의 또 다른 인스턴스를 생성하고, 이를 'kim1'이라는 변수에 할당합니다.
// 이때, 초기화 메서드(init)에 'age' 값으로 2, 'weight' 값으로 5.5를 전달합니다.
var kim1 = Man(age: 2, weight: 5.5)
// 'kim1' 인스턴스의 'display' 메서드를 호출합니다. 이 메서드는 인스턴스의 'age'와 'weight' 값을 출력합니다.
kim1.display()

모든 프로퍼티를 초기화시키는 생성자를 designated initializer라고 한다.
생성자를 호출할 때는 Man.init() 대신 init()을 생략해서 Man이라고 작성해도 된다.
class Man {
var age : Int
var weight : Double
init(age : Int, weight : Double) {
self.age = age
self.weight = weight
}
init(){
age = 1
weight = 2.5
}
func display() {
print("나이=\(age), 몸무게=\(weight)")
}
}
var kim = Man(age: 1, weight: 2.5)
kim.display()
var kim1 = Man()
kim1.display()
init()의 개수가 여러 개인데 이것을 오버로딩이라고 한다. 상황에 따라서 다른 생성자를 호출할 수 있다.
https://developer.apple.com/documentation/uikit/uiimage
UIImage | Apple Developer Documentation
An object that manages image data in your app.
developer.apple.com

생성자 오버로딩을 확인할 수 있다.
상속


class Man {
var age : Int
var weight : Double
init(age : Int, weight : Double) {
self.age = age
self.weight = weight
}
func display() {
print("나이=\(age), 몸무게=\(weight)")
}
}
class Student : Man {
var name : String
func displayS() {
print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double, name : String){
self.name = name
super.init(age:age, weight:weight) //이 줄을 안쓰면?
}
}
var kim = Man(age: 1, weight: 2.5)
kim.display()
var kim1 = Student(age: 20, weight: 65.5, name: "Minsu")
kim1.display()
kim1.displayS()
super.init()으로 부모 클래스의 생성자를 호출할 수 있다.

override

override 키워드를 사용하면 부모 클래스의 메서드 대신에 자식 클래스의 메서드를 우선시 하도록 할 수 있다.


접근 제한자



접근 제어를 생략하면 기본 값이 internal이다.
프로토콜
프로토콜은 자바의 인터페이스라고 생각하면 된다.

protocol Run {
var x : Int { get set }
func run()
}
class Man : Run { // 채택
var x : Int = 0 // 준수, confirm
func run() { // 준수
print("달려 달려~~")
}
}
자바에서는 인터페이스 구현이라고 하지만 스위프트에서는 채택이라고 한다. 그리고 내용을 구현하는 것을 준수라고 한다.

protocol Run {
var x : Int { get set }
func run()
}
class Man : Run { // 채택
var x : Int = 0 // 준수, confirm
func run() { // 준수
print("사람이 달려 달려~~")
}
}
class Dog : Run { // 채택
var x : Int = 0 // 준수, confirm
func run() { // 준수
print("강아지가 빨리 달려 달려~~")
}
}
var kim = Man()
kim.run()
var coco = Dog()
coco.run()
프로토콜의 내용은 안전하게 다 구현해야 한다.
테이블뷰




https://www.pinterest.co.kr/pin/118008452728761725/
Ios Design List Interaction Design | Ios design, Mobile app design inspiration, App interface design
아직 댓글이 없습니다! 대화를 시작하려면 하나를 추가하세요.
www.pinterest.co.kr
앱을 꾸미는데 다른 사람의 디자인을 참고하는 것이 좋다. 디자인에 자신이 없다면 검색을 통해서 어떤 디자인이 유행인지 확인해보자.

Constraint를 추가하면 이렇게 제약 조건을 확인할 수 있는데 leading은 앞쪽(왼쪽), trailing은 뒤쪽(오른쪽)을 의미한다.
class ViewController: UIViewController {
@IBOutlet weak var table: UITableView! // 옵셔널
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
옵셔널인 이유는 초기값이 없기 때문이다.

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var table: UITableView!
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier: "myCell")
cell.textLabel?.text = "\(indexPath.row)" // "KSH"
return cell
}
func numberOfSections(in tableView: UITableView) -> Int {
return 3
}
override func viewDidLoad() {
super.viewDidLoad()
table.dataSource = self
table.delegate = self
}
}

행의 수, 행의 내용, 섹션의 수 등을 지정할 수 있다.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "myCell")
cell.textLabel?.text = "\(indexPath.row)"
cell.detailTextLabel?.text = indexPath.description
cell.imageView?.image = UIImage(named: "1.png")
return cell
}

style을 subtitle으로 변경하고 label과 image를 지정해 주었다.
import UIKit
var image = ["1.png", "2.png", "3.png", "4.png", "5.png"]
var name = ["맛집1", "맛집2", "맛집3", "맛집4", "맛집5"]
var phone = ["010-1234-5678", "010-2486-5534", "010-6878-4886", "010-5675-5788", "010-2455-6354"]
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var table: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
table.delegate = self
table.dataSource = self
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "myCell")
cell.textLabel?.text = name[indexPath.row]
cell.detailTextLabel?.text = phone[indexPath.row]
cell.imageView?.image = UIImage(named: image[indexPath.row])
return cell
}
func numberOfSections(in tableView: UITableView) -> Int {
return 3
}
}

마지막으로 사진과 텍스트를 지정해서 확인해보았다.
'공부 > Swift' 카테고리의 다른 글
| [iOS][7주차] 지난 과정 & 문법 복습 (2) | 2024.04.18 |
|---|---|
| [iOS][6주차] TableView & 간단한 앱 만들기 2 / 다운캐스팅, 옵셔널 (0) | 2024.04.11 |
| [iOS][3&4주차] 간단한 앱 만들기, 문법 복습 (0) | 2024.03.28 |
| [iOS][2주차] 스위프트 복습 (0) | 2024.03.14 |
| [iOS][1주차] 들어가기 (0) | 2024.03.07 |