이번 예타면제(철도)에 대하여

오랜만에 늙은 철덕 설래게하는 소식이 들려와 백만년만에 글을 써 봅니다.
일단 예타면제라는 방법이나 경제성에 대한 감상은 적지 않겠습니다.
대부분 경제성 없는거야 뻔한 이야기니까(···)


승리자들
- 반영

1. 도봉산포천선
예타 한 번 해 통과해 보겠다고 별짓을 다 해본 노선이죠. 이건 노력상이랄까...
수도권 북부 지역 안배로 통과한 모양인데, 해당 지역에는 꽤 필요한 노선이고 효과도 상당하다고 볼 수 있습니다.
다만 그렇잖아도 길고 완행인 7호선 연장으로 간다면 운영의 묘가 필요하겠죠.

2. 석문산단 인입철도
필요하다고 말 많았던 산업철도. 지역 신청과는 무관하게 선정되었습니다.

3. 평택-오송 복복선화
KTX가 생각보다 흥한 관계로 병목이 생긴 평택-오송 간을 통째로 터널로 뚫어 노선을 하나 더 만들겠다는 원대한 계획.
이번 예타 면제가 지역 안배 차원에서만 이루어진건 아니라는 대표적인 사례가 되겠습니다.
이건 '필요는 하지만 타당성은 안 나올 것 같은' 사업의 대표사례인데, 전체 네트워크 면에서 멀리 보고 정했다는 느낌입니다.

4. 충북선 고속화
철덕이면 누구나 고개를 갸웃하게 만드는 계획... 이번 계획 최대의 에바라 할 수 있겠습니다.
제가 입덕할 때 떡밥이었던 <오송 분기 X자 축 고속철도망 구축>의 악몽이 다시 떠오르게 하는 계획이죠.
그 당시에도 오송-강릉 축은 에바라고들 다들 말했었는데, 결국 구축 되는군요(···)

5. 대전 2호선 트램
본가 앞으로 지나감ㅋ 이걸로 설명을 대신합니다...는 농담이고.
결국 하긴 하네요. 몇 년에 걸쳐 더 시끄러워질 문제를 닥치게 했다는 점이 유일한 장점입니다...

6. 남부내륙선
금액면에서 최대 사업이죠. 철덕 내에서도 말이 많지만, 개인적으로는 지지 입장입니다.
진주-거제 축은 수도권에서 가장 먼 도시권이었거든요. 이걸로 전국 고속철도망의 완성을 볼 수 있게 되었다고 할 수 있습니다.
이 노선까지 갖추어지면 고속철도 망의 충실도 면에서는 웬만한 선발국들 보다 뛰어날 겁니다.

7. 대구산업선
노력상2. 예전 글에서도 썼지만, 예타 한 번 통과해보겠다고 도로 한가운데를 달리게 한다는 신박한 생각까지 했던 노선이죠.
대구시가 애를 먹고 있던 달성군 개발에 필수적인 노선.
다만 타당성이 하도 참혹한지라 안 될 거라고 봤는데, 어째 3차 철도 계획에 들어가더니, 예타 면제까지 먹는 기적을 보여주었습니다.

8. 동해선 전철화
이건 경북이 물먹었다고 봐도 될 겁니다. 애초 예타면제 신청사항은 '복선'전철화였거든요.
게다가 동해선(포항-동해)의 양쪽 끝단이 전부 전철화 된 상황이라 전철화 자체는 언제가 되었건 반드시 해야 되는 사업이었습니다. 애초에 비전철로 건설된게 전형적인 타당성 맞추기용 공사 쪼개기라(예타의 문제점 중 하나죠)... 하게 될 걸 일찍 하는 셈이랄까.

새로운 도전자들
- 타당성 조사 추진

1. 문경-김천 단선전철
말하자면 문경선-경북선 전철화...
인천에서 성남, 충주, 문경, 김천, 진주, 거제(그렇습니다, 남부내륙선도 포함됩니다)를 연결하는 내륙선축의 가장 취약한 부분입니다.
전체적인 네트워크 면에서 하긴 해야 되는데, 경제성이 영 아닐 것 같은 부분이라고 할 수 있죠.

2. 경전선 전철화
광주-보성, 소위 서부 경전선 중에서도 끝까지 기약이 없었던 최후 구간입니다.
이 노선이 완성되면 광주-부산 간 남해안 고속화철도 축이 완성됩니다.
역시 전체적인 네트워크 면에서 하긴 해야 되는데, 경제성이 영 아닐 것 같은 부분이라고 할 수 있죠.

패배자들
- 탈락

1. 경부선(부산) 철도 지하화
부산 입장에서는 절실한 사업이지만, 기존 경부선 운영이 꼬이지 않게 하기 힘들다는 문제가 있다더군요...

2. 부전역 복합 환승역
이건 할 만 한데 탈락.

3. 대구 3호선 혁신도시 연장
아쉽긴 하지만, 선물을 두개 줄 순 없었겠죠?

4. KTX 세종역 설치
개인적으로는 찬성파.

5. 신분당선 호매실 연장
경기도 남부라서 탈락인 듯. 안습.

6. 수도권 전철 천안-독립기념관 연결
왜 이런걸...

7. 중부권 동서횡단(서산-울진) 철도사업
진지하게 이걸 선정한 충남/경북은 노답이라고 생각합니다.

8. GTX-B
GTX라... 어찌되었건 건설은 될 것 같은 노선인데, 일단 이번엔 물 먹었습니다.

개인적으로 포함되었으면 싶었던 것

1. 간선철도 서울 시내 병목 해결
이거 진짜 노답인데, 요즘엔 상대적으로 관심이 안 보이네요.
경부선 축인 수색-광명은 수서역으로 숨통이 트였고, 신안산선이 뚫리면 광명역 종착이라는 극단적인 해법도 있지만, 중앙선 축인 용산-청량리-망우는 지금 자체로도 답이 없습니다. 앞으로는 더 헬게이트가 열릴거고...
이 두 노선은 결국 대심도 터널을 뚫어야 한다는 점에서 신안산선이나 GTX와 연계해서 지금이라도 답을 찾아야 하리라 봅니다.

2. 대전-세종-오송 광역철도
대전과 세종은 연담화 될거라 봅니다. 이 두 도시에 청주까지 포함해서 거대 광역권을 만들 수 있는 노선인데, 추진이 지지부진하네요.
세종시 자체의 특수성도 감안하고, 세종역 논쟁도 잠재울 수 있는 노선이면서 타당성이 절대 안 나올 노선으로써(···), 이번 기회에 신청이라도 해볼만한데 아직 두 도시가 적극적이질 못해서...

3. 호남선 고속화
정확히는 서대전-논산 구간인데, 호남 고속철도 개통 이후 희미해져가는 대전-호남 연결을 살릴 수 있는 방법입니다.
고속선이 중복해 있는 이상 타당성은 확실히 안 나올거고요(···) 이런 저런 말은 많았는데, 역시 무시당했습니다.

***

전체적으로 봤을 때 이번 예타면제안(철도)의 경우 지역 안배도 있지만, 엄두를 못 냈던 전국 네트워크 보완 면에 주로 신경을 썼다는 느낌이 있습니다.
큰 그림에서 잘 안 그려지는 부분을 억지로라도 그렸달까... 그 면에 대해서는 평가를 하고 싶네요.

Ruby - 10 (모듈 / 예외처리) └루비

16. 모듈


- 인스턴스를 생성할 수 없고 상속할 수도 없지만, 클래스, 메소드, 상수, 클래스 변수를 모두 모아두고 재활용 가능하게 한 것. 네임스페이스 등으로 사용 가능.

module A

V = 10

end

puts A::V

- 모듈의 메소드는 그냥 사용할 수 없음. 모듈 내 메소드의 이름을 모듈명.메소드명 / self.메소드명으로 하면 사용 가능.

- include 모듈명, extend 모듈명으로 클래스에 모듈을 포함해서 사용할 수 있음.

단, 클래스가 아닌 인스턴스에 포함시키려면 extend만 사용 가능.

- 루비는 단일상속만 지원하지만, include 가능한 모듈 수에는 제한이 없다.


module A

def f

end

end

class B

include A

end

b = B.new

b.f

class C

extend A

end

c = C.new

c.f

class D

end

d = D.new

d.extend A

d.f


17. 예외처리


- raise로 예외를 발생시킬 수 있다


raise 예외메시지

raise 예외 클래스, 예외메시지


- 예외를 처리하려면 예외 발생 가능성이 있는 식을 begin에 넣고 발생한 예외는 rescue절을 통해 보완 처리를 한다. rescue 절에서 =>e라는 변수를 지정하면 예외 처리한 예외 객체가 e에 대입된다.(직전에 발생한 예외는 $!를 통해 취득할 수도 있다.)



begin

rescue [에러이름] [=>예외객체] # 예외가 날 경우

retry # begin 부터 재실행시키는 명령

[else] # 예외가 나지 않았을 경우(생략 가능)

...

[ensure] # 예외 유무 상관없이 실행(생략 가능)

end


- 예외객체의 메소드 class는 이름, message는 예외 메시지, backtrace는 예외가 발생한 시점의 콜 스택을 배열로 반환한다.

- rescue절에서 예외 클래스를 특별히 지정하지 않으면 StandardError와 그 서브 클래스로 처리. 지정을 하면 지정한 예외와 그 서브클래스로 처리.

- 여러 번의 예외 처리가 필요할 경우 rescue 절을 여러 번 기술. 하나의 rescue절에 예외 클래스를 복수지정할 수도 있다.

- rescue절에서 인수를 지정하지 않고 raise를 호출하면 발생한 예외를 다시 발생시킬 수 있다.

- 식 뒤에 rescue를 기술하면 해당 식을 실행했을 때 발생한 예외 제어 가능. 단 예외 클래스를 지정할 수는 없다.

- 예외 유무에 무관하게 마지막으로 처리하고 싶은 처리는 ensure 절에 기술.

- else 절을 사용하면 예외가 발생하지 않은 경우에만 실행되는 처리를 기술.

- begin, rescue, else 절에서 마지막으로 평가된 값이 반환값이 된다. ensure절에서 나오는 값은 안 된다.

- rescue 절에서 retry를 호출하면 begin절이나 메소드를 처음부터 다시 처리한다.



Ruby - 9 (클래스) └루비

15. 클래스


- 클래스의 구조


class Cls < Ob # 클래스 생성과 상속(이름은 대문자로 시작)

def initialize(a1, a2) # 생성자와 매개변수

super # super구문

end

public # 이하 메소드는 public, 외부에서 접근 가능.

#...


protected # 이하 메소드는 protected, 외부에서 접근 불가. 해당 클래스나 서브클래스의 인스턴스에서만 접근 가능.


#...


private # 이하 메소드는 private, 외부에서 접근 불가. 동일 인스턴스 메소드 안에서만 호출 가능.

#...

public :method # 각자의 메소드에 접근을 직접 지정할 수 있음.

end

cl = Cls.new(1, 2) # 생성자로 인스턴스 생성


- 인스턴스. 메소드명으로 인스턴스 안의 메소드 실행 가능.

- 루비에서는 인스턴스 내부는 메소드 외에는 외부에서 접근 불가하므로 인스턴스 변수를 읽기 위한 메소드가 필요


def var

@var

end


- 위는 아래처럼 줄일 수 있다. getter라고 한다.


attr_reader :var


- 인스턴스 변수에 쓰기 위한 메소드

def var=(var)

@var = var

end


- 위는 아래처럼 줄일 수 있다. setter라고 한다.


attr_writer :var


- 읽고 쓰는 기능을 모두 제공하기 위해 attr_accessor를 사용할 수 있다.


attr_accessor :var1, :var2


- 인스턴스 공통으로 하나의 메소드가 필요할 경우. 클래스 메소드 정의. 인스턴스에서는 사용 불가하지만 클래스 이름으로 사용가능.

클래스.메소드이름 / self.메소드이름

- 클래스 변수는 앞에 @대신 @@. 해당 클래스에서만 사용가능.

- 오버라이드 : 자식클래스에서 부모클래스의 메소드의 기능을 변경하여 사용.

- 인스턴스 메소드가 실행될 때, super를 사용하면 같은 이름의 부모클래스의 메소드를 실행한다. super를 쓸 때는 인수의 개수를 정확히 맞춰야 한다(인수가 없는 상황에서는 super()로 써 줄 것)

- 오버로딩은 가능하지 않지만 메소드를 새로 정의할 수 있다.



Ruby - 8 (메소드·블록·람다) └루비

14. 메소드·블록·람다


def 이름(인자, 인자=기본값)

내용

end


- 메소드 인자에 기본값이 정해져 있으면 메소드 호출 시 그 인자를 넣지 않아도 기본값으로 들어감.


- 기본값이 들어간 인자가 앞에, 일반 인자가 뒤에 있을 경우, 호출할 때 인자를 하나만 주면 일반 인자로 들어가고, 두개 다 주면 양쪽 모두에 들어감. 반복은 허용 안 됨.


def func you="you", greet

puts you, greet

end

func "Hello"

you

hello


- 메소드는 기본 nil을 반환, return으로 반환값을 지정할 수 있지만, return 없이도 메소드 맨 마지막 계산을 return함.


def func a, b

a + b

end

func 3, 4

=> 7

- 메소드에서 블록을 받아와 실행 가능

def greet(you=”ruby”)

puts “Hello”

yield you

end

greet(“python”) do |you|

puts you

end

- Proc으로 저장 가능한 블록 객체를 생성해 메서드에 사용 가능


you = Proc.new do |you| # you = proc do |you|

puts you

end

you.call "Ruby" # you.() # you[]


- 블록인자(&)는 블록(do~end)을 가져와서 yield나 블록변수.call로 실행가능


pr= Proc.new do |x| x ** 3 end

[1,2,3].collect!(&pr)


- 가변인자(*)는 정해지지 않은 개수의 인자를 가져와 배열로 저장

- 접두사 &, *는 메소드 안에서는 붙이지 말 것. 함수에서 한번씩 밖에 사용하지 못함.


def f *a, &b

i = -1

while (i+=1) < a.count

yield a[i] # b.call a[i]

end

end

f(1,2,3,"abc",[6,7]) do |x|

puts x

end


- 블록 내에서 next를 사용하면 블록에서 탈출하고, 인자가 있으면 메서드에 전달.

- 블록 내에서 break를 사용하면 메서드를 종료하고, 인자가 있으면 메서드의 return이 됨.

- 람다식은 생성에 new 메소드 사용하지 않음.


l = lambda do |x| … end # l= ->{}

l.call x # l.class

- 람다는 블록과 달리 return이 가능하고 인수를 검사함(람다가 메소드에 가까움)

- 람다를 사용할 때는 블록과 달리 인수의 개수에 기본값을 주거나 가변인수를 쓰지 않으면 정해진 개수만 받을 수 있음

- 재귀호출도 가능함.


pibo = lambda do |a| return a <=2 && 1 || pibo.call(a-2) + pibo.call(a-1) end

puts pibo.call n



Ruby - 7 (조건문 / 반복문) └루비

12. 조건문


- 논리 연산자

<, >, <=, >=, !=, ==

&, &&, and : And

|, ||, or : Or

!, not : Not

^ : Xor


- if 문에서 조건문과 실행문의 줄을 구분할 거라면 then은 생략 가능


if 조건1 then

실행1

elsif 조건2 then

실행2

else

나머지

end

- 한줄로 줄여 사용


if 조건; 실행; end

- 실행문이 한 줄 이라면 실행문을 먼저 쓰고 조건문 사용 가능


실행 if 조건


- 실행문이 여러줄이라면 begin ... end 문 뒤에 if 문 사용 가능


begin

실행

end if 조건


- if문 안에 상수나 변수를 넣어서 if 문 앞의 변수에 바로 대입시킬 수 있음


변수 = if 조건 then 결과1 else 결과2 end

- unless문은 if문의 반대


- 삼항연산 가능


조건 ? 참일때 : 거짓일때


- case 문의 값에 범위를 사용 가능. break문은 불필요함. then도 마찬가지로 생략 가능.


case

when 값1 then

실행1

when 값2 then

실행2

else

나머지

end

- if 처럼 when문 안에 상수나 변수를 넣어서 case 문 앞의 변수에 바로 대입도 가능

13. 반복문


- while 문


while 조건

실행

end

- if 문 처럼 실행문 뒤에 조건문 사용 가능


실행 while 조건


- 조건에 상관없이 한번은 실행됨


begin

실행

end while 조건

- until문while의 반대

- for문


for i in 범위/배열

실행

end


- loop문


loop do 실행 end


break : 반복문 중단

next : 남은 명령 무시하고 루프를 다음으로

redo : next가 반복문에서 명령만 무시한다면 반복문을 처음부터 반복

retry : 반복문을 초기화 시키고 다시 시작

- 루비에서는 반복문보다 each, upto, downto, times등의 열거하는 메소드가 많이 사용된다.

- 반복문 처리가 다중 내포관계에 있을 때 throw를 이용해 한번에 다중 대역을 탈출 할 수 있다.


catch :esc do

다중 내포관계

throw :esc

end

end


1 2 3 4 5 6 7 8 9 10 다음