static과 class 제대로 알아보자

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


  • 함수: func이라는 키워드로 생성하는 것 모두 함수
  • 메서드: 클래스, 구조체, 열거형 속에 포함되는 함수

instance method

인스턴스와 관련된 메서드로 인스턴스를 생성해야만 호출이 가능하다.

class Person {
  func getName() {
    print("\(name)")
  }
}

이렇게 아무런 수식어 없이 func 으로 시작하는 메서드 모두 인스턴스 메서드라고 한다.
이러한 인스턴스 메서드를 호출하기 위해서는 아래와 같은 방법을 사용한다.

  1. Person이라는 인스턴스를 먼저 생성하고
  2. 생성된 인스턴스에 .을 사용해 메서드에 접근한다.

즉, 인스턴스 메서드는 인스턴스와 연관된 메서드이기 때문에, 인스턴스를 생성해야만 인스턴스를 통해 메서드에 접근할 수 있으며 아무런 수식어없이 func으로 선언된 메서드는 모두 인스턴스 메서드를 의미한다.

type method

형식(type)과 관련된 메서드로, 인스턴스 생성없이 형식(Type)의 이름만 알면 호출이 가능하다.
메서드 선언시 func 이란 키워드 앞에 static혹은 class가 붙으면 그 메서드는 타입 메서드이다.

class Person {
  static func getName() {
    print("\(name)")
  }

  class func getAge() {
    print("\(age)")
  }
}

위와 같은 메서드는 모두 타입 메서드이다.
이러한 타입메서드를 호출하기 위한 방법은 아래와 같다.

  1. 타입메서드는 인스턴스와는 전혀 상관없기때문에 Person이라는 Type에만 연관되어있다.
  2. 따라서 Person이라는 type 이름을 호출한다.
Person.getName()
Person.getAge()

타입메서드는 인스턴스 메서드가 아니기 때문에, 인스턴스를 생성할 필요도 없으며
오로지 자신이 속해있는 type의 이름인 Person만 알면 그 Person을 통해 메서드를 호출할 수 있게 된다.

static? class?

타입메서드를 작성하기 위해서는 메서드 앞에 static 혹은 class를 적어주면 되는데,
이둘을 적어주는 궁극적인 차이는 메서드 오버라이딩(override)의 여부이다.

1. static : 오버라이딩을 금지함

static은 항상 서브클래스에서 해당 타입 메서드를 오버라이딩하는 것을 금지 한다.

class Person {
  static func getName() {
    print("name")
  }
}
class PersonPerson: Person {
  override static func getName()  // cannot override static method
}

이렇게 static으로 선언된 타입 메서드 getName의 경우 서브클래스에서 오버라이드 하려는 경우 에러가 발생한다.

2. class : 오버라이딩을 허용

class는 서브클래스에서 타입 메서드 오버라이딩을 허용 한다.

class Person {
  class func getName() {
    print("name")
  }
}
class PersonPerson: Person {
  override class func getName()
}

이렇게 class로 선언된 타입메서드의 getName의 경우 서브클래스에서 오버라이딩을 해도 에러가 발생하지 않는다.

타입 메서드와 인스턴스 메서드의 멤버 접근 범위

  • 일반 프로퍼티: 저장 프로퍼티 & 연산 프로퍼티
  • 타입 프로퍼티: 저장 타입 프로퍼티 & 연산 타입 프로퍼티
class Person {
  let name = "zehye"  // 저장 프로퍼티
  static let alias = "zehyezehye"  // 저장 타입 프로퍼티
}

이렇게 name이라는 저장 프로퍼티와 alias라는 저장 타입 프로퍼티가 있을때 인스턴스 메서드와 타입 메서드 모두 이 둘을 사용할 수 있을까?

  1. 타입메서드: 타입 멤버(프로퍼티&메서드)만 사용가능하고, 같은 타입멤버는 이름없이 접근 가능
  2. 인스턴스 메서드: 인스턴스 멤버(프로퍼티&메서드)를 사용할 수 있고, 타입 멤버도 타입만 알면 접근 가능

타입메서드의 경우

class Person {
  let name = "zehye"
  static let alias = "zehyezehye"

  static func sayHi() {
    print(name)  // error! Instance member 'name' cannot be used on type 'Person'
    print(alias)
  }
}

저장 프로퍼티인 name은 인스턴스멤버이다.
따라서 인스턴스가 생성될때마다 메모리에 올라가는 인스턴스와 연관된 프로퍼티이다.

하지만 타입메서드는 인스턴스를 선언할 필요가 없는 메서드이기 때문에 자신과 같이 인스턴스를 생성할 필요없는 타입 프로퍼티의 경우, 같은 타입에 한해 타입 이름없이 접근이 가능 하지만 인스턴스가 생성되어야만 저장공간을 갖는 인스턴스 멤버에는 접근이 불가능하다.

인스턴스 메서드의 경우

class Person {
  let name = "zehye"
  static let alias = "zehyezehye"

  static func sayHi() {
    print(name)  
    print(Person.alias)
  }
}

반대로 인스턴스를 생성해야만 접근이 가능한 인스턴스 메서드에서는 인스턴스 멤버인 name에는 당연하게 접근이 가능하고(인스턴스 생성이 됐으니 해당 인스턴스 멤버인 name도 메모리에 올라감) 인스턴스와 상관없는 타입 멤버에 접근시 기존 방식과 같이 타입 이름을 통해 접근이 가능 하다.

legacy란?

|

개인 공부 내용을 정리한 글입니다.
잘못된 내용이 있다면 편하게 댓글 남겨주세요!


legacy

개발자 친구들과 대화를 하다보면 레거시, 레거시하며 레거시라는 단어를 많이 들어볼 수 있을 것이다.
그렇다면 레거시라는 건 무슨 말을 의미하는 것일까?

레거시 프로그램, 레거시 데이터, 레거시 코드와 같은 말속의 레거시라는 것은 프로그래밍 언어, 플랫폼 그리고 기술 등에 있어서 과거로부터 물려 내려온 것을 의미한다. 컴퓨터를 사용하는 대부분의 기업들은 중요한 업무를 처리하는 레거시 응용 프로그램과 데이터베이스들을 가지고 있다. 즉, 레거시 시스템은 낡은 기술이나 방법론, 컴퓨터 시스템, 소프트웨어 등을 말한다.

말이 너무 어려운데, 그냥 간단하게 말하면 아래와 같다.

레거시의 사전적인 의미는 (남이 남긴)유산으로 해석할 수 있다.
레거시 코드란 다른 사람에게 넘겨받은 읽기 어렵고 수정하기 오래된 어려운 코드

기술의 변화가 많은 프로젝트들에 있어서 시간이 지나면서 기술이 발전하고 그러면 그럴수록 레거시 코드들이 점점 쌓여만간다.
그렇다면 프로젝트 내에서 레거시 코드들이 많아진다면 겪을 문제점은 무엇이 있을까?

1. 해당 코드를 이해하기 어려운 문제점 발생 > 변수명, 메소드명이 명확하지 않거나 너무 복잡한 경우
2. 해당 코드에 대한 완벽한 이해가 어렵기 때문에 수정이 필요한 곳에 정확한 수정을 하기 어려움
2-1. 수정했다하더라도 이에 발생할 사이드이펙트가 어디에서 발생할지에 대한 예측도 어려움
3. 코드에 대해 이해가 어려워지다보니 해당 프로젝트에 대한 유지보수 작업을 진행하는 데에 있어 어려움

레거시 코드를 만들지 않기 위해서는 어떻게 해야하나?

1. magic number 사용을 하지 않기

if(item == 1 || item == 2) {
  Item.remove(item)
}

private let book = 1
private let pensil = 2

if(item == book || item == pensil) {
  Item.remove(item)
}

첫번째 방식의 경우 숫자 1, 2가 무엇을 의미하는지 직관적으로 알수 없지만, 아래와 같이 코드를 작성하면 직관적으로 각각이 무엇을 의미하는지 알아보기 쉽기 때문에 아래와 같은 방법을 사용하는것이 좋다.

2. 의도를 나타내는 이름을 사용하기

3. if문이 덕지덕지 붙어있는 복잡한 조건식을 피하자

외는 이 블로그를 통해 확인해보자! 참고한 블로그

alpha, opaque, opacity의 차이란?

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


alpha, opaque, opacity

1. alpha: 0.0 ~ 1.0 범위의 값으로 0.0은 완전하게 투명, 1.0은 완전하게 불투명

2. isOpaque: view가 투명한지 불투명한지 결정하는 Bool값.

  • true: drawing 시스템이 view를 완전하게 불투명하게 처리 > 성능향상에 좋음
  • false: 투명하게 처리

3. opacity: 불투명도 0.0(투명) ~ 1.0(불투명)범위내에 있어야 하며, 해당 범위는 벗어나는 값은 최소값 또는 최대값으로 고정.

  • 기본값은 1.0이며 alpha와의 차이는 alpha는 UIView에, opacity는 CALayer의 프로퍼티이다.

final 키워드를 사용하는 이유

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


final

타 프로그래밍 언어와 마찬가지고 swift 언어 또한 클래스의 상속을 지원한다. 더이상 해당 클래스에서 하위 클래스로의 전체 클래스 또는 일부(메서드, 프로퍼티)가 상속에 따른 재정의가 될 필요가 없다고 판단한 경우 final키워드를 각 요소 앞에 추가함으로써 상속을 방지할 수 있다.

  • 재정의할 필요가 없을때 사용
  • 클래스 자체가 상속되는것을 막고싶을 때 사용 > final 클래스를 상속받으려는 클래스는 컴파일 시 에러가 발생함

이 밑의 개념은 아직 내가 잘 이해를 못한 것 같다.
이해가 되면 이해한 만큼 다시 정리해봐야할 것 같다….ㅠ

vtable

vtable은 가상 메서드 테이블을 이르는 것으로, 메서드 오버라이딩에 따라 실행 시점에 어떤 메서드를 실행할 지 결정하는 동적 디스패치를 지원하기 위해 프로그래밍 언어에서 사용하는 매커니즘이다.

final 키워드 적용이 성능에 미치는 영향

  • final로 선언된 요소들은 직접 호출
  • 그렇지 않은 경우는 vtable을 통해 간접 호출

오버라이딩한 메서드는 실행 시점에 어떤 메서드를 실행할 지 결정하는 반면 final 키워드가 적용된 메서드는 컴파일 시점에 어떤 메서드를 실행할 지 결정할 수 있기 때문에 성능 상 이점을 가진다고 한다.

m1 맥북 초기 설정 정리해보기

|

m1 맥북 구매 후 초기 설정해야할 내용을 정리해보았습니다.
필요한 내용은 계속해서 추가해 나갈 예정이며 더 좋은 방법이 있거나 잘못된 부분이 있다면 알려주세요! :)


Homebrew 설치하기

m1 맥북 용 homebrew 설치 명령어

/bin/bash -c "$(curl -fsSL https://gist.githubusercontent.com/nrubin29/bea5aa83e8dfa91370fe83b62dad6dfa/raw/48f48f7fef21abb308e129a80b3214c2538fc611/homebrew_m1.sh)"

아래는 기존 homebrew 설치 명령어

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

만약 기존과 같이 위 코드로 homebrew를 설치하고 brew help와 같은 명령어를 터미널에 입력해보면 아래와 같은 문구가 나타날 것이다.

zsh: command not found: brew

터미널 커맨드 창에서 brew라는 명령어를 찾을 수 없다는 의미로 이럴때는 아래 명령어를 터미널에 입력!

eval $(/opt/homebrew/bin/brew shellenv)

그러면 brew help와 같은 명령어를 입력했을 때 아래와 같은 창이 나옴

brew cask

  • brew ~ : 커맨드 라인 프로그램 (c, java, python 같은..)
  • brew cask ~ : GUI 프로그램 (Safari, Chrome, Word 같은..)
  1. brew update : 홈브류 최신버전으로 업데이트
  2. brew upgrade [프로그램명]: 홈브류에 설치된 프로그램 최선버전으로 업데이트
  3. brew search [프로그램명] : 홈브류를 통해 설치 가능한 프로그램 찾기

예전에는 brew cask 이런식으로 명령어를 사용해서 앱을 깔았는데, 이제는 이렇게 안해도 되는것 같다. (그래서 나는 그냥 진행했다….ㅎ) 사용하려면 brew install --cask 사용!

brew cask 는 2.7.0 업데이트부터 명령이 비활성화 되었다. 2020-12-01 부터 사용 불가.

Git 설치

최신버전의 git으로 설치하는 명령어

brew install -s git

git이 제대로 깔려있는 지 확인하고 싶다면 터미널에 git이라고 쳐본다.
아래와 같은 화면이 보인다면 잘 깔려있는 것

Mac SSH 생성 및 Github 등록

맥북에 SSH 키가 있는지 확인

cat ~/.ssh/id_rsa.pub

키가 있다면 해당 키가 터미널 창에 보일 것이다. 없다면 아래와 같은 메시지가 뜬다.

No suck file or directory

그러면 이제 생성해보자.

ssh-keygen

위 명령어를 입력하면 터미널에서 경로와 파일명을 설정하라는 메시지가 뜰것이고 나는 그냥 여기서 추천해준(지정해준) 대로 enter 누르며 진행헀다. 잘 생성되어있는지 다시 확인해보자.

cat id_rsa.pub

그러면 터미널창에서 내 SSH 키가 보일 것이고 이를 복사해놓은 상태로 Github으로 고고

  1. Github 홈페이지에 들어간다
  2. 오른쪽 상단 내 계정을 눌러 settings > SSH and GPG keys 탭 선택
  3. New SSH key 클릭
  4. 타이틀은 아무거나 상관없지만, 보통 사용하는 기기 이름을 적어줍니다.
  5. 복사한 id_rsa.pub을 붙여넣기!
  6. 저장

git config

터미널에서 git configuration을 진행합니다.

git config --global user.name "지정할 이름"
git config --global user.email "지정할 이메일"

iterm2 설치

brew install iterm2

사실 개발환경에서는 에러 메시지가 영어로 나오는것이 훨씬 좋기때문에(검색에 용이…) 맥북 언어 설정 자체를 영어를 우선으로 두는게 좋다. 그럼에도 만약 한글을 사용하게 되어 혹시나 한글이 깨진다면 ⌘ + , -> profile -> text -> unicode -> form을 NFC로 변경을 하면 된다고 한다.

zsh, oh-my-zsh

// zsh 설치
brew install zsh

// oh-my-zsh 설치
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

zsh 관련 설치

// zsh-autosuggestions > 터미널 입력 시 history 기반 단어를 추천
brew install zsh-autosuggestions

설치 진행 후 ~/.zshrc에 아래 명령어를 추가

source /opt/homebrew/share/zsh-autosuggestions/zsh-autosuggestions.zsh
// zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "$HOME/.zsh/zsh-syntax-highlighting"

설치 진행 후 ~/.zshrc에 아래 명령어를 추가

echo "\nsource $HOME/.zsh/zsh-syntax-highlighting/zsh-syntax- highlighting.zsh" >> "$HOME/.zshrc"

이렇게 설치를 하고나면 터미널을 나갔다 다시 들어와도 되고 source ~/.zshrc를 하면 설치한 내용들이 적용되어있는 것을 볼 수 있을 것이다.

Node.js 설치

brew install node

이외 설치해볼 것들

  • brew instlal google-chrome
  • brew install vlc
  • brew install atom
  • brew install slack

맥 시간 설정 안되어있을 경우

환경설정 > 날짜 및 시간 > 좌물쇠 풀고 > 시간대 설정 변경해주기

iterm 테마 꾸미기

플러그인 설치도 할 수 있지만 나는 이런거엔 관심이 별로 없기에..

환경설정 들어가서 바꿔주기

iterm 상태바 보여주기

iterm configuration 에 들어가서
profile > session > Status bar enabled 체크 > Configure Status Bar 선택해 원하는 항목 추가 저장하고 나와서 Appearance > Status bar location으로 상태바 위치 설정

맥북 대략적인 초기 기본 설정

  • mission control > Automatically rearrange Spaces based on most recent use > 체크 안함: 최근에 만진 화면 순서대로 미션 컨트롤 창 순서가 바뀌지 않도록 설정
  • 언어는 무조건 영어가 우선순위 가 될 수 있도록 (선택사항이긴 함): locale 설정때문에 오류가 발생하는 걸 방지해주고 영어 오류 메시지가 구글 검색에 더 용이함
  • 패스워드, 분실대비 스크린 메시지 설정, 디스크 암호화 등
  • Keyboard > text > 자동변경 옵션, 입력한 단어 변경 등 위에서부터 3개 다 체크 해제
    • Correct spelling automatically 체크 해제
    • Capitalize words automatically 체크 해제
    • Add period with double-space 체크 해제
    • Use smart quotes and dashes 반드시 해제해주기!
  • Keyboard > shortcut > Use Keyboard navigation to move focus between controls: 키보드로 예/아니오 설정할 수 있는건데 이건 선택사항임
  • TrickPad > tap to click 선택!: 트릭패드 꾹 안누르고 터치만으로 클릭 가능하게 하는것
  • Accessibility > Pointer Control > Trackpad options > Enable dragging > three finger drag: 세 손가락으로 드래그 가능하게 함 > 요건 신세계였음
    • 근데 이 방법을 사용하면 원래 세 손가락으로 미션컨트롤 이동을 했는데, 이젠 네손가락으로 이동을 하게 됨(선택은 자유!)
  • finder preference > show all filename extensions 체크함: 모든 파일의 확장자를 보여줌

cocoapods 설치

  • 터미널복제 > 터미널2의 get info > use rosetta
  • 터미널2에서 sudo gem install ffi
  • iterm2로 돌아와서 brew install cocoapods