ruby (6) 썸네일형 리스트형 DI(Dependency Injection) 루비에서는 DI 코드를 만들 수 있고 의존성을 보내는 주체는 개발자이다. 프레임워크를 사용했을 시 의존성을 프레임워크가 보내주는 것이다.(IoC) 또한 레일즈 이야기를 하자면, 스프링에서는 DI를 제공해주는 반면, 레일즈에서는 DI를 제공하지 않는다. 왜냐하면 스프링처럼 빈(스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트)을 관리하면서 외부 모듈이나 클래스가 필요한 클래스에 주입을 해주는 기능이 없기 때문이다. 그래서 레일즈에서는 다른 모듈이나 클래스에 접근하고 싶을 때, 직접 생성해서 접근한다. 이러한 이유로 결합도가 높은 코드가 나올 수 밖에 없는 것이다. 1. 의존성 이야기 잘 디자인된 객체는 하나의 책임만 지고 있다. 그래서 복잡한 환경을 표현하기 위해 다른 객체와 협업을 할 수밖에.. instance variable encapsulation 루비에서 인스턴스 변수는 디폴트가 private이다. 그래서 접근하려면 attr_reader, attr_writer, attr_accessor로 변수를 지정해줘야 외부에서 접근 가능하다. 여기에서는 인스턴스 변수 캡슐화에 대해서 알아보자. class InstanceAi attr_reader :data def initialize(data) @data = data end def plus(v) data + v end end ins = InstanceAi.new(1) puts ins.data puts ins.plus(2) ##### ===> result 1 3 1. attr_reader, attr_writer, attr_accessor 이 3개의 예약어는 인스턴스 변수에 wrapper method를 제공해준다... 상속 vs 믹스인(mixin) 루비만의 모듈 사용 방법이다. 이 방법을 이용하면 다중 상속 문제나 굳이 상속을 할 필요가 사라진다. 루비는 단일 상속을 지원하는 언어이고 믹스인을 통해 다중 상속을 간접적으로 지원한다. 1. 그렇다면 상속이 아닌 왜 믹스인을 써야 할까? 정답은 상황에 따라 다르다. 상속을 사용해야 하는 상황은 리스코프의 치환 원칙으로 설명할 수 있다. 이 원칙은 "타입 T 객체 x에 관해 참이 되는 속성을 q(x)라고 한다면, S가 T의 자식이라면 타입 S의 객체 y에 대해 q(y)도 참이 된다."로 설명할 수 있다. 즉, 부모 클래스의 객체는 모두 자식 클래스의 객체로 바꿔서 사용할 수 있고 자식 클래스는 한 종류의 부모 클래스라고 말할 수 있어야 한다는 의미다.(is-a) ex) 자동차는 운송 수단이다. 즉, is.. 블록 1. 블록이란? 블록은 중괄호 {} 나 do와 end 키워드로 둘러싸인 코드 덩어리다. 일반적으로 한 줄에 블록을 작성할 수 있다면 중괄호를 사용하고 그렇지 않으면 do와 end 키워드를 사용 블록은 익명 메서드의 본문과 비슷한 무언가라고 생각해도 무방 2. 블록 사용 방법 ids = [1,2,3,4,5] sheets = [] ids.each_slice(3) { |idxs| sheets += Sheet.where(id: idxs) } or ids.each_slice(3) do |idxs| sheets += Sheet.where(id: idxs) end 이렇게 두 가지 방식으로 쓸 수 있다. each_slice() 함수의 로직을 확인해보면, def each_slice(n) block_given? ? (yi.. 루비에서 람다식이란 루비를 사용한다면 람다식을 절대 빼놓고 설명할 수 없다. 루비 언어는 전통적인 for문을 사용하지 않고 list.each 함수를 사용한 후블록 문에 람다(이름 없는 함수)식을 넣어서 처리한다. 1년 동안 람다를 사용하면서 느낀 거지만, 루비에서 람다를 사용하는 이유는 편하고 직관적이고 이해하기 쉽고 적은 코드로 많은 내용을 표현할 수 있기 때문이라고 생각한다. 물론 단점은 람다식에 익숙하지 않으면 이 식에 적응하고 이해하는데 시간이 걸린다는 것이다. 자 그럼 람다식에 대한 예시를 들어보겠다. 1. 람다식 사용 ids = [1,2,3,4,5] sheets = [] ids.each_slice(3) { |idxs| sheets += Sheet.where(id: idxs) } 블록에 서브 id 리스트를 넘겨주.. ruby 특징 1. String+String 가능. String *int 가능. 다른 건 불가능. 2. to_s to_i to_f ,,,바꾸어준다. 3. 값의 비교는 Java와 반대이다. 루비에서는 ==(일반 비교)가 값의 비교이고 equal?가 id값의 비교이다. 4. reference type 만 있다 a = 3을 만들면 Fixnum class에 저장이 되고, 특정 범위가 넘어서면 Bignum class 에 저장이 된다. 5. 클래스 안에 정의되는 변수들은 @ 를 붙여서 만든다. 6. 외부에서 생성자를 통해 만든 변수(인스턴스)를 통해서 클래스 안에 정의된 변수들에는 접근이 불가능하다. private 이 default이다. 7. For I in list or for I in range(1..10) Range를 표현.. 이전 1 다음