Juwan Park :: alias 문의 유용한 쓰임

alias 문의 유용한 쓰임

★프로그래밍/Ruby :: 2015. 9. 19. 18:16

루비의 명령문 중 alias 문이 있습니다.

alias라는 단어의 사전적 의미를 보면, 부사로 쓰일 땐 '~라는 가명으로 알려진, 일명 ~라 불리는'의 뜻으로, 명사로 쓰일 땐 '(범죄자 등의) 가명'의 뜻으로 쓰입니다.
전산 용어로 쓰일 때는 '파일·인터넷 주소 등에 쓰이는 가명'을 뜻합니다.

루비에서 alias 문은 def 문으로 정의된 프로시저의 별칭을 지정할 때 사용되는 구문입니다.
루비에는 alias 말고도 alias_method 문도 있지만 여기선 일단 alias만 간단히 설명하기로 합니다.

다음 예제를 봅시다.

def helloworld
  puts "Hello, world!"
end

alias hello helloworld

hello

이 코드에서 1번 줄부터 3번 줄까지는 "Hello, world!"라는 메시지를 출력하기 위한 프로시저를 helloworld라고 정의하였습니다.
그리고 5번 줄에는 프로시저 helloworld의 별칭을 hello라고 정의하였습니다.
7번 줄은 hello를 프로시저 호출문으로 넣었습니다.

이렇게 되면 프로시저 helloworld의 별칭으로 정의된 hello를 씀으로써 직접 helloworld라고 써서 호출한 것과 같이 취급, 화면에 "Hello, world!"라는 메시지가 출력되는 결과가 나옵니다.

RPG 만들기 시리즈의 스크립트 편집기 같은 경우 이미 정의된 프로시저를 재정의하되 코드를 간소화해야 한다면 alias 문이 필요할 수도 있는데, 예를 들어 다음과 같은 경우를 봅시다.

def helloworld
  puts "Hello, world!"
end

def helloworld
  puts "HELLO, WORLD!"
end

helloworld

이 경우 어떻게 될까요?
정답은 '화면에 "HELLO, WORLD!"라고 출력된다'입니다. 루비에서는 같은 이름의 프로시저를 정의하면 맨 마지막으로 정의된 것만 유효합니다. 따라서, 이 예제에선 먼저 정의된 "Hello, world!" 출력 명령은 무효화되고 나중에 정의된 "HELLO, WORLD!" 출력 명령만 유효하게 됩니다.

그렇다면, 이 예제에서 "Hello, world!"와 "HELLO, WORLD!"가 모두 출력되게 하고 싶습니다. 두 번 정의된 helloworld 프로시저를 합치면 간단하겠지만 합치지 않는다면 어떤 방법이 있을까요? 물론, 먼저 정의된 helloworld에 넣은 코드를 복사해서 붙여넣는 방법도 있겠지요. 이 예제에선 먼저 정의된 쪽의 코드가 한 줄이므로 이 방법이 좋겠지만 여러 줄이라면 그걸 다 복사해서 붙여 넣으면 효율성이 떨어집니다.

그럴 땐 alias 문을 쓰면 간단합니다.

def helloworld
  puts "Hello, world!"
end

alias hello helloworld

def helloworld
  hello
  puts "HELLO, WORLD!"
end

helloworld

이와 같이 두 번째로 helloworld 프로시저를 정의하기 전에 alias 문으로 먼저 정의된 helloworld 프로시저의 별칭을 선언합니다. 그리고 두 번째로 정의되는 helloworld 프로시저에 먼저 정의된 helloworld 프로시저의 별칭을 넣습니다.

그러면 12번째 줄의 helloworld 부분을 실행할 때 두 번째로 정의된 helloworld가 호출되지만 그 안에 먼저 정의된 helloworld의 별칭으로 프로시저를 호출하게 되므로 결과적으로는 먼저 정의된 helloworld와 두 번째로 정의된 helloworld가 모두 호출되는 것과 같이 되어 화면에 "Hello, world!"와 "HELLO, WORLD!"가 둘 다 표시됩니다.

만약 다음과 같은 경우는 어떨까요?

def helloworld
  puts "Hello, world!"
end

alias hello helloworld

def helloworld
  puts "HELLO, WORLD!"
end

hello

이런 경우 정답은 '화면에 "Hello, world!"만 출력된다.'입니다. alias 문으로 정의된 프로시저의 경우, 예를 들어 프로시저 A를 정의하고 그 별칭으로 B를 정의하면 그 다음에 프로시저 A를 재정의하더라도 먼저 지정된 A의 별칭 B에는 영향을 미치지 않기 때문입니다. 간단히 말해서 'alias B A' 이렇게 쓰면 정의된 프로시저 A를 프로시저 B로 복사한다는 뜻이라고 생각하시면 됩니다. 그래서 나중에 재정의된 프로시저 안에 먼저 정의된 프로시저의 별칭 호출을 넣더라도 재귀호출이 발생하지 않습니다. 다만, 별칭이 아닌 본명 그대로 또 넣으면 재귀호출이 발생한다는 점에 주의할 필요가 있습니다.

def helloworld
  puts "Hello, world!"
end

def helloworld
  helloworld
  puts "HELLO, WORLD!"
end

helloworld

이런 식으로 정의하면 무한재귀호출이 발생하여 스택 오류를 일으키게 됩니다.

물론 별칭도 재정의가 가능합니다. 프로시저와 마찬가지로 같은 별칭을 재정의하면 먼저 정의된 별칭은 무효화됩니다. 또한, 별칭을 먼저 정의하더라도 같은 이름의 프로시저를 정의할 수 있고(이 경우 먼저 정의된 별칭은 무효화) 그 반대도 마찬가지입니다.

Today    Yday    Tot
Juwan Park
Juwan Park's blog is powered by Daum and .
Contemporary Blue for .
Designed by Juwan Park. Creative Commons License
▲ TOP