iOS에서 버튼 액션 연결 - addTarget vs addAction

2025. 6. 13. 16:28·📱 iOS
-->

 

 

iOS 앱을 개발하다 보면 버튼을 누르거나 스위치를 바꾸는 등, 사용자의 동작에 반응해야 할 일이 자주 있다.

 

이럴 때 대표적으로 사용하는 방법이 바로 addTarget(_:action:for:)이다.

 

오늘은 그 addTarget과, iOS 14부터 새로 등장한 addAction을 알아보고 비교해봤다.

 

🤔  addTarget(_:action:for:)이란? 


 

addTarget은 UIControl 계열(UI버튼, 스위치, 슬라이더 등)의 요소가 사용자 이벤트에 반응하도록 특정 메서드를 연결해주는 방식이다.

let button = UIButton()

button.addTarget(self, action: #selector(tapButton), for: .touchUpInside)

@objc 
func tapButton() {
    print("버튼이 눌렸어요!")
}

이 코드는 버튼을 눌렀다 뗐을 때(.touchUpInside), tapButton()메서드가 실행되도록 연결한 예시다.

 

🔍 하나씩 뜯어보자.

  • addTarget: “어떤 객체(self)”에게 “무슨 동작을 할지” 알려주는 메서드
  • self: 이 메서드를 실행할 주체 (보통은 현재의 ViewController )
  • action: #selector(tapButton) → tapButton()이라는 메서드를 실행하겠다는 뜻
  • for: .touchUpInside → 버튼을 눌렀다 뗄 떼 실행되는 이벤트

즉, 이 버튼을 눌렀다 떼면, ViewController에 있는 tapButton() 메서드가 실행된다.

 

 

🧐 selector(선택자)란?


#selector(tapButton) 이 부분이 바로 selector이다.

 

selector는 Objective-C에서 사용되던 개념으로, 어떤 메서드를 실행해야 할지를 가리키는 식별자(포인터)이다.

 

Swift에서 Objective-C와 호환되는 이벤트 처리 방식(addTarget)에서는 이 selector 문법을 필수적으로 사용해야 한다.

#selector(tapButton)
// -> tapButton()라는 메서드의 이름을 Objective-C 스타일로 참조하는 것

 

 

🫠 @objc는 왜 붙여야 할까?


@objc는 Swift에서 정의한 메서드를 Objective-C에서도 사용할 수 있게 허용해주는 역할을 한다.

 

Swift에서 만든 함수는 기본적으로 Objective-C에서 접근할 수 없다.

 

하지만, 우리가 사용하는 addTarget 방식은 Objective-C 런타임을 기반으로 동작하며, 이때 연결할 메서드는 selector를 통해 참조되는데, 이 역시 Objective-C 방식이다.

 

즉, addTarget이 내부적으로 Objective-C 방식으로 메서드를 호출하기 때문에, Swift 메서드를 Objective-C에서도 접근 가능하도록 표시해주는 @objc 키워드가 반드시 필요한 것이다.

 

 

😤 이제 addAction(_:)에 대해 알아보자!


iOS 14부터 기존 방식보다 훨씬 간결하고 Swift 스타일에 맞는 addAction(_:) 방식이 새롭게 등장했다.

 

기존에는 버튼을 눌렀을 때 동작을 처리하려면, @objc 메서드를 따로 만들고, 그걸 #selector로 연결해야해서 코드가 분산되고 번거로웠다.

 

그런데! addAction은 그냥 클로저 안에 바로 동작을 정의할 수 있다!

 

굳이 함수를 따로 만들지 않아도, 버튼 설정하는 그 자리에서 다 처리할 수 있는 것이다. 👍👍

let button = UIButton()

button.addAction(UIAction { _ in
    print("버튼이 눌렸어요!")
}, for: .touchUpInside)

이처럼 @objc도 없고, selector도 없다.

 

Swift 코드를 작성할 때 보통 클로저를 많이 사용하기에, 이런 방식이 훨씬 자연스러운 것 같다.

 

다만, iOS 14 이상에서만 사용이 가능하다는 단점이 있다. 만약 하위 버전도 지원해야 하는 앱이라면 어쩔 수 없이 addTarget을 사용해야 한다.

 

 

💬 정리


  • addTarget: Objective-C 스타일의 전통적인 이벤트 연결 방식
  • selector: 어떤 메서드를 실행할지 Objective-C 방식으로 지정하는 포인터
  • @objc: Swift 메서드를 Objective-C 에서도 사용할 수 있게 표시해주는 키워드
  • addAction: Swift 스타일의 클로저 기반 이벤트 연결 방식(iOS 14 이상부터 사용 가능)

 

 

 

'📱 iOS' 카테고리의 다른 글

CodingKey로 JSON 키 매핑하기  (0) 2025.06.19
Xcode에서 시뮬레이터 추가하는 방법  (0) 2025.06.18
[iOS] Push, Present 화면 전환에 대해 알아보자.  (0) 2022.02.24
[iOS] Xcode 코드 자동 정렬(Re-Indent), 단축키  (0) 2021.08.31
[iOS] Xcode 시뮬레이터 키보드가 안보일 경우  (0) 2021.07.29
'📱 iOS' 카테고리의 다른 글
  • CodingKey로 JSON 키 매핑하기
  • Xcode에서 시뮬레이터 추가하는 방법
  • [iOS] Push, Present 화면 전환에 대해 알아보자.
  • [iOS] Xcode 코드 자동 정렬(Re-Indent), 단축키
MoriOS
MoriOS
기억하기 위해 기록하는 공간 🖋️
  • MoriOS
    MoriOS
    MoriOS
  • 전체
    오늘
    어제
    • 분류 전체보기 (67)
      • 📌 Swift (12)
      • 📱 iOS (11)
      • 💡 Algorithm (1)
      • ❕Data structure (4)
      • 🪙 Python (0)
      • ⚙️ Git (3)
      • 🖋️ TIL Journal (33)
      • 📝 Etc (3)
  • 블로그 메뉴

    • GitHub
  • 인기 글

  • 태그

    TiL
    제약조건 수정
    셀 높이
    updateconstraints
    swift cow
    ios
    cow 값 타입
    커밋 아이콘
    cow 참조 타입
    Optional
    cow 쓰기 복사
    swift optional
    GitHub
    SnapKit
    후행클로저
    remakeconstraints
    swift
    static
    Split
    makeconstraint
    uikit
    git moji
    제약조건 변경
    스크롤 길이
    prepareconstraints
    프로그래머스
    커밋 이모지
    weak
    Codable
    Components
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
MoriOS
iOS에서 버튼 액션 연결 - addTarget vs addAction
상단으로

티스토리툴바