본문 바로가기
YAGOM CAREER STARTER

[TIL] 20221227: git reset --hard, namespace, Implicitly Assigned Raw Values

by Rhode 2022. 12. 28.

본문은 야곰 아카데미 커리어 스타터 캠프를 통해 학습한 내용을 회고한 글입니다.


git reset --hard

이 방법은 -hard를 사용하므로 최신 커밋 이후로 본인이 working directory에서 했던 작업(아직 커밋을 하지 않은 작업)또한 날려버릴 수 있다. 그러니 주의해야한다.

커밋한 내용을 삭제하고 싶을 때 사용하면 된다. 우선 git reflog를 통해 기록을 살펴보자.

이렇게 기록이 나온다. git reflog를 통해서는 지워진 커밋또한 볼 수가 있다. 이 것을 보고 돌아가고 싶은 시점을 결정하면 된다. 가장 왼쪽의 올리브색 글씨는 commit ID이다. 

  • 이전 커밋으로 돌아가고 싶을 때: git reset --hard HEAD~1
  • 두 단계 전 커밋으로 돌아가고 싶을 때: git reset --hard HEAD~2
  • 네 단계 전 커밋으로 돌아가고 싶을 때: git reset --hard HEAD~4
  • 특정 시점의 커밋으로 돌아가고 싶을 때: git reset --hard 돌아가고 싶은 시점의 commit ID
  • 특정 시점의 커밋으로 돌아가고 싶을 때: git reset --hard HEAD@{돌아가고 싶은 시점의 번호}

만약에 commit: python study 221228 09:07 부분으로 돌아가고 싶다면, git reset --hard 8eb6b03 을 해주거나, git reset --hard HEAD@{1} 을 해주면 된다. 

HEAD{0}이 다시 8eb6b03이 되었고, reset: moving to 8eb6b03이라는 메시지가 떴다. 이것은 커밋을 되돌리는 것이지 push까지 되돌리는 것은 아니라고 보여진다. 

되돌린 후의 github repository를 보면 22 블록 이동하기.py가 python study 221228 09:09로 푸쉬되어있다는 것을 볼 수가 있다. 나는 커밋을 하고 바로 푸쉬를 해줬는데, 푸쉬한 것까지는 python study 221228 09:07으로 되돌려지지 않았다.

 

자, 그럼 삭제한 커밋을 원래대로 되돌리고자한다면 어떻게 해야할까? git reflog를 다시 보며 원하는 위치로 git reset --hard 를 해주면 된다. 

아무튼 이렇게 사용할 수 있다.

 

 

네임스페이스 name space

네임스페이스란 다양한 종류의 개체를 식별하고 참조하는 데 사용되는 집합체다. 네임스페이스는 지정된 모든 개체 집합이 쉽게 식별할 수 있도록 고유한 이름을 갖도록 한다. 프로그래밍에서 네임스페이스는 일반적으로 특정 기능을 중심으로 기호와 식별자를 그룹화하고 동일한 이름을 공유하는 여러 식별자 간의 이름 충돌을 방지하기 위해 사용한다. 

 

swift에서는 네임스페이스를 지원하지 않는다고 한다. 그렇지만,  구조체 struct를 이용한 방법, 열거형 enum을 이용한 방법을 통해서 네임스페이스의 역할을 수행할 수 있다고 한다.  

구조체를 통한 namespace

struct Dog {
	static let hodoo = "호두"
	static let yulmoo = "율무"
}

이렇게 구조체를 통해 네임스페이스의 역할을 수행할 수 있다. 그러나 해당 구조를 인스턴스화 할 수 있다는 단점이 있다. 이를 막기 위해서는 안에 private init() {} 을 넣어주면 된다.

struct Dog {
	private init() {}

	static let hodoo = "호두"
	static let yulmoo = "율무"
}

private init() {}을 통해 구조체의 초기화를 private으로 선언하여 인스턴스화를 막을 수 있다. 그러나, 굳이~ 그러려면 구조체를 써야할까 하는 의문이 든다. 그래서 사용할 수 있는 방법이 열거형을 통한 방법이다.

 

열거형을 통한 namespace

enum Dog {
	static let hodoo = "호두"
	static let yulmoo = "율무"
}

방법은 쉽다. struct 대신에 enum을 써주면 된다. 여기의 열거형에서는 case를 쓰지 않는다. static을 사용한다. case 없이 static let값으로만 열거형을 생성하면 인스턴스로 초기화할 수 없기 때문에 실수로 협업자가 인스턴스를 만드는 행위도 막을 수 있다.

 

과제를 수행하면서 하드코딩 했던 것을 다음과 같이 WinnerResult라는 열거형을 만들어 네임스페이스 했다.

enum WinnerResult {
    static let user = "사용자"
    static let computer = "컴퓨터"
    static let noWinner = "무승부"
}

그 결과

이렇게 if winner == "사용자"였던 하드코딩 부분이 

WinnerResult.user 로 쌈빡하게 바뀌었다. 이제는, 이 부분이 뭘 의미하는지 더 자세하게 알 수 있을 것이다.

 

Implicitly Assigned Raw Values

When you’re working with enumerations that store integer or string raw values, you don’t have to explicitly assign a raw value for each case. When you don’t, Swift automatically assigns the values for you.
For example, when integers are used for raw values, the implicit value for each case is one more than the previous case. If the first case doesn’t have a value set, its value is 
0.
integer나 string을 쌓아두는 열거형 작업을 할 때, 각각의 경우들에 raw value를 할당해줄 필요는 없다. swift가 알아서 그것을 할당해줄 것이기 때문이다. 
예를 들어서, integer가 raw value로 사용 되었을 때, 암시적인 값은 이 전 값보다 하나 더해진 값이다. 만약 첫번째 케이스가 값이 없다면, 그 값은 0이 된다.
private enum Menu: Int, CaseIterable {
        case end = 0
        case scissors = 1
        case rock = 2
        case paper = 3
    }

위와 같은 코드가 있을 때 raw value로 0, 1, 2, 3을 할당해주지 않아도 알아서 암시적으로 할당을 해준다는 내용이다.