객체지향 용어에 대한 글들을 찾아보니 개념의 일부만 정리되어 있거나 매우 중요한 개념이 제대로 다루어지지 않은 경우가 많아 보인다. 특히 비 객체지향 언어와의 정합성, 동일하거나 유사한 용어들에 대한 명확한 정리가 없는 점이 안타깝다. 그래서 객체지향 및 그와 연관된 개념들을 생각나는 대로 모두 정리해 보았다. 이 글은 아주 기초적인 내용들을 미리 알고 읽어 보는 것이 좋긴 하다. 하지만 객체지향을 접한지 오래 되었다고 해도 제대로 이해하지 못하는 중요한 부분들에 대해서 강조해 두었으니 충분히 도움이 될 것이라 생각한다.

일부 코드 예제나 추가적인 용어는 시간을 내어 더 작성할 예정이다. 내용이 많으니 시간을 충분히 가지고 도전하기 바란다.


객체지향 기본 요소를 이용한 코드 예제

// interface

interface IShape{ // IShape 타입

    public void draw();// 공개 추상 메소드

}

// 추상 클래스

abstract class Base{

    abstract public void init();// 추상 메소드의 프로토타입

}

// 클래스

class Subject

    extends Base// 상위 클래스, 부모 클래스를 상속한다

    implements IShape// 인터페이스를 구현한다

    // SubjectSubject 고유 타입이면서 Base 타입이고, IShape 타입이기도 하다

{

    Color color;// 변수, 참조 변수

   

    int width;// 변수, primitive 변수

   

    public void setColor(Color c){// 공개 메소드

        // csetColor 메소드의 매개 변수이다.

        this.color = c; // 여기서 cSubject의 멤버 객체가 된다.

    }

   

    @Override

    public void init(){}// 재정의. 추상 메소드를 구현한다

   

    @Override

    public void draw(){

        System.out.println("draw subject");

        color.brighter();// 위임

    }

}

public static void main(String[] args) {

    Subject subject = new Subject();// 객체화.

    // subjectSubject 객체를 참조하고 있다.

    Base base = (Base)subject;// up casting

    Subject subject2 = (Subject)base;// down casting

}


[JAVA] 자바 언어에서만 사용하는 용어

[C++] C++에서만 사용하는 용어

[정적] 코드 상에 존재하는 개념. 정적인 코드를 통해 동적인 것들을 만들어 내게 된다.

[동적] 실제 소프트웨어 동작 시 작동하는 것에 대한 개념. 메모리 상에 올라가 있는 것.

[OOP] OOP 개념이 아닌 소프트웨어 용어. OOP 용어와의 대비를 위해 사용.

~ : 대체적으로 동의어로 사용 가능(비 객체지향 용어지만, 객체지향에는 없는 용어이므로 대충 객체지향 언어로는 이와 같다는 의미)

 

[OOP] 함수(function) = 기능 ~ 행위(Operation) = 메소드(Method) = 멤버 함수 = 공개(public) 메소드 + 비공개(private) 메소드

-       속성에 대한 조작을 수행하는 명령어들을 모아 놓은 단위. 소프트웨어가 동작한다는 의미는 이 메소드가 실행된다는 것을 의미한다.

 

[OOP] 변수(variable) ~ 속성(Attribute) = 필드(field) = 데이터 = 멤버 변수 = 참조 변수 + primitive 변수

-       변경 가능한 값(value)을 저장할 수 있는 프로그래밍 요소. 메모리 상의 공간을 확보하고 있으면서 정ㅇ해진 타입을 가지고 있는 것.


[OOP] primitive 변수

-       비 객체지향 언어에서 말하는 기본 자료형. char, short, int, long 등과 같이 객체가 아닌 멤버 변수를 의미.


[정적] 참조 변수

-       객체가 다른 객체를 참조할 수 있도록 선언된 변수.

-       이 참조 변수가 멤버 객체를 가리키게 된다. 참조 변수를 가지고 있는 객체와 멤버 객체 간의 관계를 “has-a” 관계라고도 한다. 마치 한 객체가 (참조 변수를 통해) 다른 객체를 내부에 가지고 있는 것처럼 보이기 때문이다.

 

[동적] 멤버 객체 = 위임(delegation) 객체 = 참조(reference) 객체 = 내부 객체 = 레퍼런스(reference)

-       다른 객체의 필드로 선언되어 있는 객체

-       멤버 객체는 참조 변수를 통해 사용된다.

 

위임(Delegation)

-       1. A라는 객체가 가진 책임(Responsibility)을 수행하기 위해서 멤버 객체에게 책임의 일부 또는 전부를 수행하도록 시키는 것.

-       2. 멤버 객체를 이용하기 위해서 멤버 객체의 메소드를 호출하는 행위

 

책임(Responsibility)

-       객체가 설계된 기능적 목적. 객체가 해야 할 일.

 

공개(public) 메소드 = 공용 메소드 ~ API(Application Programming Interface) = 인터페이스(interface)

-       1. 객체의 외부에서 호출이 가능하도록 노출된 메소드

-       2. 객체 외부로부터의 명령을 받는 메소드. 이 특성 때문에 모든 공개 메소드의 명칭은 명령형으로 작성되어야 하고 그렇게 해석되어야 한다.

 

비공개(private) 메소드 = 전용 메소드

-       객체 내부에서만 호출이 가능하도록 감춰진 메소드.


접근성(visibility)

-       공개(public) / 보호(protected) / 비공개(private)과 같이 객체의 내부와 외부 또는 상속 관계에 따라서 멤버 변수나 메소드에 대한 접근 권한을 제어하는 키워드.

 

인터페이스(interface)

-       1. 공개 메소드와 동일한 의미로 사용되는 용어.

-       2. [JAVA] 공개 추상(abstract) 메소드를 가진 객체화 불가능한 상위 타입

 

[JAVA] interface

-       1. 순수하게 공개 추상 메소드로만 이루어진 추상 클래스.

-       2. [JAVA] 공개 추상(abstract) 메소드를 가진 객체화 불가능한 상위 타입

-       (원래 1번의 의미가 가장 강하지만 최근에는 static 필드와 default 메소드(구현이 있는 메소드)가 추가되어 엄밀하게는 1번이 정확한 의미는 아니다. 하지만 클래스와 인터페이스를 비교하는 개념으로써는 1번이 맞다.)

-       3. 인터페이스끼리의 상속(extends)을 통해 확장이 가능하고, 하나의 클래스가 여러 인터페이스를 구현(implements)하는 것이 가능하다. 따라서 C++과 같은 언어의 다중 상속 문제를 회피할 수 있는 대안으로 이해 되기도 한다.

 

추상(abstract) 클래스 = [C++]가상(virtual) 클래스

-       객체화 될 수 없는 클래스.

-       보통은 적어도 한 개 이상의 추상 메소드를 가지고 있는 클래스를 의미한다.

-       ([JAVA] interface는 모든 메소드가 공개 추상 메소드인 추상 클래스이다.)

 

추상(abstract) 메소드 = [C++]가상(virtual) 함수

-       프로토타입(prototype)만 있고 동작을 정의한 구현부가 없는 메소드.

 

[OOP] 프로토타입(prototype)

-       [리턴타입][이름][(매개변수)]

-       형식의 예 : int add(int a, int b);

 

[OOP] 매개 변수(argument) = 인자 = [OOP]파라메터(parameter)

-       메소드에 input으로 들어가는 변수.

-       객체와 primitive 변수 모두 매개 변수가 될 수 있음.

 

타입(Type) *** 중요 ***

-       [OOP] 1. 변수의 자료형(char, short, int, long, struct )

-       2. 객체가 다뤄질 수 있는 형식명. 객체가 XX 타입이라는 것은 객체가 XX 클래스 인터페이스로 참조(reference) 가능하다는 것을 의미한다.

 

참조(reference)

-       객체를 지칭하는 행위. 객체를 참조 변수에 할당하는 행위

 

참조 변수(reference variable)

-       Object aObject; à 여기서 aObject Object 타입의 객체를 지칭하는 참조 변수이다.


[정적] 클래스(Class) = 타입(Type) + 공개 메소드 + 비공개 메소드 + 필드

-       객체에 대한 명세서. 청사진.

-       객체지향 소프트웨어를 사전으로 비유하자면 클래스는 단어에 해당한다. ‘단어는 그 의미를 나타내는 설명을 가지고 있다. ‘설명에 해당하는 것이 클래스를 구현한 코드이다. 그러면 객체는? 단어로 지칭할 수 있는 실제 세계의 존재이다. ‘사과단어’, 즉 클래스이고 실제 사과는 객체이다. 따라서 사과라는 클래스는 한 개 뿐이지만, ‘실제 사과는 여러 개가 될 수 있다.

(예제)

 

-       공개 메소드는 특별히 분리할 필요가 있다. 공개 메소드는 클래스가 객체화 되었을 때 외부와 소통할 수 있는 유일한 통로이다. 객체는 수동적인 식물과 같아서 외부에서 공개 메소드를 통해 자극을 주지 않으면 아무것도 하지 않는 것이 기본이다.(동적(active) 객체는 예외.)

-       클래스가 메소드와 필드로 이루어져 있다는 말은 거짓말이다. 클래스에게 가장 중요한 것은 타입이다. 따라서 클래스는 타입과 메소드(공개 + 비공개), 그리고 필드로 이루어져 있다는 것이 정답이다. 타입은 상속을 통해 다형성과 같은 객체지향의 가장 중요한 개념을 형성해 주기 때문에 클래스가 가지고 있는 것 중에서 가장 중요한 것이다.

 

[동적] 객체(Object) = 인스턴스 = 상위 타입 + 고유 타입 + 공개 메소드 + 아이덴티티(identity)

-       실제 메모리가 할당되어 동작하는 객체지향의 최소 단위.

-       클래스의 동적 형식. 클래스가 개념이라면 객체는 실제다. 사과가 모든 사과를 나타낼 수 있도록 정의된 단어, 즉 클래스라면 내가 들고 있는 진짜사과는 그 객체이다.

-       정적 객체의 동작은 오직 공개 메소드에 의해 일어난다. 따라서 공개 메소드는 명령으로 해석되어야 하고, 공개 메소드의 내부 구현은 공개 메소드 명칭에 맞는 명령이 전달되었을 때 수행되어야 할 일을 구현해야 한다.

-       객체는 객체화가 완료된 후, 소프트웨어의 동작에 따라 자신이 가질 수 있는 모든 타입들로 변경되어 지칭되고 사용될 수 있다. 하지만 잘 설계된 객체지향 소프트웨어 내에서 자신의 고유 타입보다는 상위 타입으로 지칭되어 사용되는 경우가 일반적이다. 특히 상위 타입으로 지칭되다가 다시 그 하위 탕입, 또는 자신의 고유 타입으로 지칭되는 것은 일종의 금기이다. 고유 타입을 사용하면 상위 타입으로 지칭됨으로써 얻을 수 있는 정보 은닉(information hiding)의 장점을 잃어버린다.

 

고유 타입

-       객체가 생성될 당시에 생성의 기반이 된 클래스 타입. new Object()라는 명령을 통해 새로운 객체가 생성되었다면 Object가 고유 타입에 해당한다.

-       고유 타입 개념은 중요하다. 어떤 객체가 어떤 타입으로 참조될 수 있는지를 결정하기 때문이다.

 

아이덴티티(identity) = 고유성

-       어떤 객체를 다른 객체와 구분 짓는 고유한 특성.

-       모든 객체는 고유성을 확인할 수 있는 공개 메소드를 가지고 있어야 한다.([JAVA] equals() 메소드)

 

정적(passive) 객체 = 일반 객체

-       내부에 쓰레드를 선언하고 있지 않은 객체.

-       공개 메소드를 통해 명령하지 않으면 아무 일도 하지 않는 객체.

-       일반적으로 객체라고 하면 보통 정적 객체를 의미한다.

 

동적 객체(active) 객체

-       내부에 쓰레드를 선언하고 있고, 쓰레드의 동작에 기반하여 작동하는 객체.

-       정적 객체의 반대말.

 

추상화(Abstraction)

-     개별적인 대상들의 차이점을 배제하고 동일한 점을 추출해 내는 것. 특히 동일한 점을 모아 클래스 또는 인터페이스화 하는 것.

-    "모델링(Modeling)" 이라는 말과 동일하게 쓰인다. "수학적 모델링"이라고 하면 현실 세계의 문제들의 개별적인 차이점을 배제하고 동일한 특성들을 파악해서 오직 수치와 공식으로 표현 가능한 요소들로 바꾸는 작업이다.

-    따라서 객체지향에서 추상화란 "클래스 모델링" 또는 "객체 모델링"이라는 말로 표현할 수 있다.

-    실세계의 예를 들면 철수, 영희, 희동이는 각자 고유한 특성을 가지고 있지만 이런 특성을 배제하고 나면 이름과 나이, 성별, 사는 곳과 같은 동일한 특성을 가진 '사람'이다. 이렇게 동일한 특성들을 모아서 '사람'이라는 이름의 클래스를 만드는 과정이 추상화(Abstraction) 과정이다.


정보 은닉(information hiding) ****** 매우 중요. 클래스, 객체보다 더 중요 ******

-       정보 은닉은 객체지향 언어가 만들어진 목적에 해당하는 개념이다.(모든 개념 중에서 가장 중요한 개념이다. 믿음 소망 사랑 중 사랑이며, good, better, best 중에 best이다. 정보 은닉만 알면 나머지 개념이 왜 생겨난 것인지를 알 수 있다.)

-       정보 은닉은 객체지향 언어를 설계한 모든 목적을 달성하기 위한 특성이다. “객체화한다는 의미로서의 캡슐화와 상속(그 중에서도 타입의 상속)은 정보 은닉을 가능하게 하기 위한 수단(일 뿐)이다.

-       객체의 고유 타입 은닉

n  객체가 생성된 이후, 고유 타입이 아닌 그 상위 타입으로 지칭되도록 함으로써 생성 이후에는 객체의 고유 타입을 모르도록 하는 것.

n  객체의 고유 타입을 모른 상태에서 구현할 수 있다는 것은 그 고유 타입에 의존하는 코드가 없다는 말이다. 이는 그 고유 타입 객체가 삭제되거나 수정되더라도 코드는 전혀 변경되지 않는다는 것을 의미한다.

n  다형성 = 서로 다른 객체들의 고유 타입을 은닉하고 동일한 상위 타입을 통해 다수의 객체를 동일하게 다루는 것.(객체의 고유 타입 은닉 중 특수 케이스에 해당함)

-       객체의 필드 및 메소드 은닉 = 캡슐화

-       타입 하위 캐스팅 금지 : 상위 타입으로 지칭된 객체를 하위 타입으로 바꿔 지칭하는 것을 금기시 함으로써 온전하게 정보 은닉을 달성할 수 있다.

-       정보 은닉의 장점

n  재사용성 : 객체가 다른 객체의 고유 타입에 의존하지 않도록 함으로써 다른 소프트웨어나 다른 모듈에서도 쉽게 이용할 수 있음.

n  유연성 : 위임 객체의 고유 타입에 의존하지 않게 함으로써 위임 객체를 교체하기 쉽게 만들어 소프트웨어 기능을 교체/확장하기 용이하도록 함.

n  유지보수성 : 객체가 가져야 할 기능들을 각각 고유한 클래스에 구현하도록 함으로써 기능의 수정 시 다른 기능에 영향을 주는 것을 최소화 함. 객체가 가진 최소한의 공개 메소드만을 호출함으로써 설계 변경 시 변경할 코드의 양을 최소화 함.

-       객체지향에서 설계를 통해 좋은 특성을 얻는다고 하는 설명이나 좋은 설계를 대표하는 디자인 패턴, 아키텍쳐 패턴, 프레임워크 구조에서 볼 수 있는 패턴들은 모두 다정보 은닉 개념을 활용한 것들이다.

 

캡슐화(encapsulation)

-       1. 다루고자 하는 변수와 그 변수를 다루는 함수를 묶어 객체로 만드는 행위

-       2. 정보 은닉의 하위 개념 중 하나로써, 객체의 필드를 비공개(private)로 하고, 꼭 필요한 경우에만 메소드를 공개를 설정하는 것.

-       캡슐화의 장점은

n  필드에 대한 임의 접근을 방지하여 의도하지 않은 정보 변경을 막을 수 있다. 필드에 대한 접근을 하는 메소드에 대해서만 관리 하면 데이터의 동기화와 같이 구현이나 테스트가 어려운 특성도 상당히 구현하기 쉬워진다.

n  메소드 공개를 최소화하여 객체간의 연관 관계를 느슨하게 함으로써 잠재적인 변경 사항의 반영을 쉽게 한다.

n  객체의 동작을 이해하는데 필요한 정보를 계층화한다.(즉 더 중요한 공개 메소드를 우선 이해하고 비공개 메소드에 대해서는 그 다음 단계에 이해하는 식이다.)

 

 

상속(inheritance)

-       상위 클래스의 타입과 공개 메소드, 필드를 물려 받는 것.

-       상속에서 가장 중요한 부분은 타입을 물려 받는다는 것이다. 이 부분에 대한 강조가 부족하여 객체지향을 제대로 이해하지 못하는 경우가 너무나 많다. 상속을 통해 타입을 물려 받으면 하위 클래스는 상위 타입으로 지칭될 수 있다. 이것이 정보 은닉의 장점을 확보할 수 있도록 해준다. 공개 메소드와 필드를 물려 받아 중복 코드를 줄일 수 있다는 점이 객체지향의 장점이라면, 정보 은닉(여기서는 하위 타입 은닉)을 통해 재사용성, 유연성, 낮은 결합도, 유지보수성, 단일 책임 등의 특성을 얻을 수 있다는 점은 객체지향 언어가 만들어진 목적에 해당한다.

-       그다지 중요한 부분은 아니지만 어떤 경우에는 메소드의 구현이나 필드를 재 구현하지 않기 위해서 상속을 이용하기도 한다고 한다. “위대하신 타입 상속에 비해 중요도가 많이 떨어지는 정보이므로 참고만 하도록 하자.

 

다형성(polymorphism)

-    하나의 객체가 서로 다른 타입으로 지칭될 수 있음을 이르는 말. 클래스가 상위 클래스를 상속하면 상위 클래스의 타입까지 상속받게 된다. 이 때 상속을 받은 클래스는 상위 클래스 타입임과 동시에 자기 자신 타입이기도 하다. 이렇게 여러 타입(= 모양 = 형)을 가질 수 있는 클래스의 특성이 바로 다형성이다.(C언어의 struct와 비교해 보라. C 언어의 struct는 기존의 struct를 내부에 선언하여 사용할 수는 있어도 기존에 있는 struct 타입으로 사용 될 수는 없다.)

-       서로 다른 객체들의 고유 타입을 은닉하고 동일한 상위 타입을 통해 다수의 객체를 동일하게 다루는 것.(정보 은닉의 한가지)

-       다형성은 오케스트라 지휘로 비유할 수 있다. 각각의 고유 타입을 가진 객체를 오케스트라의 바이올린 연주자, 첼로 연주자, 플롯 연주자 등이라고 하면 상위 타입은 연주자이다. 지휘자 격인 객체는 이들 객체를 다룰 때 바이올린 연주자연주하세요, “첼로 연주자연주하세요와 같이 이야기 하지 않는다. “연주자 여러분 연주 하세요라고 한마디만 하면 끝난다. 이처럼 각각의 객체의 다른 점보다 같은점, 즉 상위 타입(여기서는 연주자)을 통해서 여러 다른 객체들을 동일하게 다루는 것이 다형성이다. 당연히 끊임없이 여러 연주자들를 외치는 것보다 단 한번만 연주자라고 부르는 것이 코드를 줄이고 객체를 대체하는데 유리하다.

-       메소드 재정의(overrinding)도 다형성의 일종이다.

 

메소드 재정의(overriding)

-       1. 추상 메소드의 구현부를 구현하는 것.

-       2. 이미 구현부가 있는 메소드의 구현부를 대체하여 구현하는 것. 보통 2의 의미로 더 많이 쓰인다.

-       3. 재정의된 메소드는 프로토타입은 같지만 동작이 다르다. 따라서 재정의된 메소드를 이용하는 객체는 재정의 되지 않은 메소드와 동일하게 취급할 수 있고, 따라서 다형성을 이용하는 수단이 될 수 있다.

-       가급적 구현부를 대체하는 방식보다는 추상 메소드를 제공하는 편이 코드를 이해하기가 훨씬 수월하다.

 

메소드 오버로딩(method overloading)

-       동일한 명칭에 다른 인자를 받는 메소드들을 여럿 구현하는 것.

-       메소드 오버로딩은 근본적으로 같지 않은 인자에 대한 취급 방법을 동일하게 하는 것이라고 생각할 수 있다.(근본적으로 같은 것이라면 여러 메소드를 만들 필요도 없다.)

 

상위 캐스팅(up casting)

-       하위 타입 객체를 상위 타입 변수로 지칭하는 것.

 

하위 캐스팅(down casting)

-       상위 타입 변수로 지칭되던 객체를 하위 타입 변수로 지칭하는 것. 객체지향 언어에서 하지 말 것으로 정해진 것 중의 하나.

 

Has-a 관계 = association = 연관 = 연관 관계

-       어떤 객체 A가 참조 변수를 가지고 있고, 그 변수를 통해서 다른 객체 B를 멤버 객체로 가지는 관계를 A has-a B 관계라고 한다.

 

Is-a 관계 = generalization(일반화) 또는 인터페이스에 대해서는 realization

-       어떤 객체 A가 다른 객체 B의 상위 타입이고, 다른 객체 B는 객체 A의 하위 타입일 때 B is-a A 관계이다.

Posted by 이세영2
,

기초적인 메소드 이름 만드는 법

일반적으로 메소드 이름을 아래와 같이 만들 것을 많은 곳에서 권하고 있다.

1. 동사 + 명사형 이름으로 만들 것 : getData() / set Data() / calculateData() / computeData


하지만 조금만 더 이해하고 나면 더 좋은 메소드를 만들 수 있다. 아래의 내용을 먼저 이해하고 넘어가도록 하자.


객체는 수동적(passive)이다

객체는 외부에서 메소드를 호출해 주지 않으면 아무 일도 하지 않는다. 객체는 완벽하게 수동적이기 때문이다. 따라서 메소드 명칭은 수동적인 객체에게 무언가를 시키는 형태의 이름이 되어야 한다. 즉 객체에게 명령하는 형식의 이름이어야 한다. 따라서 객체의 메소드 이름 만드는 규칙은 정확하게 말하면 아래와 같다.


메소드 명칭 = 명령형 동사 + 목적어

단순히 동사 + 명사형으로 생각하지 않기 바란다. 예를 들어 getData()라는 메소드 명칭은 "데이터를 가지고 온다."라는 의미로도 해석 할 수 있지만 좀 더 명확하게는 "데이터를 내놔!" 이다. 이렇게 해석하는 것이 좋은 이유는 객체를 구현할 때 좀 더 구현을 정확하게 할 수 있기 때문이다. 객체를 구현할 때 getData() 메소드를 구현하면서 "데이터를 가지고 온다" 라고 해석하고 구현하기 시작하면 구현이 꼬이기 시작한다. 반대로 객체가 "데이터를 내놔!"라는 명령을 받았을 때 해야 할 일을 getData() 메소드에 구현하면 된다고 생각하고 구현을 시작하면 구현이 매우 명료해 진다.


메소드 이름을 해석하는 관점

실제로 잘 되어 있는 오픈 소스들은 객체가 수동적이라는 관점으로 메소드 이름을 작성한다. 따라서 메소드를 해석할 때에도 이와 같은 관점에서 해석해야 한다. 객체가 sendEvent()라는 메소드를 가지고 있을 때 이를 "이벤트를 보낸다"라고 해석하지 말고 "이벤트를 보내라!"라고 명령하는 것으로 해석해야 한다. 유사하게 make(만들어라), add(더해라, 또는 집어 넣어라), remove(제거해라), initialize(초기화해라) 등으로 해석하는 편이 훨씬 소스를 이해하는데 도움이 된다.

Posted by 이세영2
,
Eclipse 단축키.xlsx


Java 프로그래밍 툴로 Eclipse를 많이 사용한다. Eclipse가 제공하는 단축키도 많고 단축키를 새로 바인딩 할 수도 있는데, 그 중에서도 매우 유용하게 사용할 수 있는 것들을 골라서 소개해 보도록 하겠다. 특히 단축키는 외우고 있을 때 더욱 위력일 발휘하기 때문에 나 같은 경우도 모니터 앞에 단축키 목록을 출력해서 복사해서 붙여 놓고 있다. 그럴때 사용하기 좋도록 엑셀파일로 만들어 첨부해 두었다.


이동 단축키

원하는 곳으로 이동을 쉽게 할 수 있는 단축키들이다.

Ctrl+객체클릭 변수나 클래스 등을 정의한 곳으로 이동

대부분 알만한 단축키인데 컨트롤을 누르고 객체명 또는 타입명을 클릭하면 해당 객체나 타입의 선언부로 이동한다.


Ctrl+Shift+G 변수나 함수 등을 레퍼런스 하는 곳으로 이동

    변수나 함수명을 드래그 또는 더블 클릭 해서 선택한 후 이 단축키를 누르면 아래와 같이 해당 변수나 함수를 레퍼런스 하고 있는 곳이 열거 된다. 클릭하면 해당 코드로 이동할 수 있다.


Alt+LEFT 이전 커서 위치로 이동

    매우 유용한 단축키인데, 한 곳에서 편집을 하고 있다 다른 곳으로 이동한 후, 다시 이전 위치로 이동하고 싶을 때 이 단축키를 누르면 된다. 여러번 반복해서 이전 위치로 이동하는 것도 가능하다.


Alt+RIGHT 다음 커서 위치로 이동

    위의 키와 함께 쓰이는 키로써, 편집을 하던 이전 위치로 이동했다가(Alt + LEFT) 다시 다음 위치로 이동하고 싶을 때 이 단축키를 누르면 다시 돌아간다. 역시 반복적으로 복귀하는 것이 가능하다.


찾기 단축키

Ctrl+Alt+G 전체 workspace에서 문자열 찾기

    문자열을 선택한 후 이 단축키를 누르면 아래쪽 Search 창에 해당 문자열이 들어 있는 모든 프로젝트의 모든 파일을 찾아서 보여 준다.


Ctrl+K 선택한 문자열을 파일 내에서 찾기

    문자열을 선택한 후 이 단축키를 누르면 파일 내에 있는 동일한 문자열을 "위에서 아래" 순서로 찾아서 커서를 이동시켜준다.


Ctrl+Shift+K 선택한 문자열을 파일 내에서 역순으로 찾기

    문자열을 선택한 후 이 단축키를 누르면 파일 내에 있는 동일한 문자열을 "아래에서 위" 순서로 찾아서 커서를 이동시켜준다.



주석 단축키

Ctrl+Shift+/ 블록을 블록 주석으로 처리

    화면에서 일부 블럭을 드래그 하여 선택한 후 이 단축키를 누르면 /*로 시작하여 */로 끝나는 블럭 주석으로 만들어준다.


Ctrl+Shift+\ 블록 주석 제거

    이미 블럭 주석이 되어 있는 부분을 선택한 후 이 단축키를 누르면 블럭 주석이 해제된다.


Ctrl+/ 한줄 주석 처리 또는 제거

    화면에서 일부 블럭을 드래그 하여 선택한 후 이 단축키를 누르면 각 줄이 "//"로 시작하는 한줄 주석들로 만들어준다.


자동화 단축키

Alt+Shift+R 변수나 클래스 등의 리팩토링

    변수나 클래스명 등 모든 명칭에 마우스를 올리거나 드래그 해서 선택 한 후 이 단축키를 누르면 아래와 같이 명칭에 박스가 생긴다. 그 후 명칭을 편집하여 변경하면 그 명칭을 사용하는 곳 전체에서 명칭이 한꺼번에 변경된다. 종종 변경된 명칭이 기존의 명칭과 충돌되면 에러가 발생한다.


Ctrl+Shift+O 자동으로 import

    외부 패키지나 라이브러리에 있는 클래스를 사용하게 되면 참조 오류가 발생한다. 만약 패키지나 라이브러리가 이미 프로젝트에 등록이 되어 있다면 이 단축키를 눌렀을 때 자동으로 import 코드를 생성해 준다.


Ctrl+I     들여쓰기 자동 수정

    일부 블럭을 드래그 하여 선택한 후 이 단축키를 누르면 들여쓰기를 설정된 포맷에 맞게 수정해 준다. 외부 소스를 복사해 왔을 때 종종 들여쓰기 단 수나 스페이스바 들여쓰기가 안맞는 경우가 있는데 이때 사용하면 알아서 사용하는 포맷에 맞게 들여쓰기를 해준다.


구조 보기 단축키

Ctrl+T(또는 F4) 클래스 Hierarchy 보기

    클래스의 계층이 복잡할 경우, 또는 인터페이스가 정의되어 있는데 인터페이스를 구현한 구체 클래스를 찾기 힘든 경우에 클래스 명 또는 인터페이스 명 위에 커서를 놓고 이 단축키를 누르면 그 클래스의 계층도를 보여 준다. 아래는 IDestination이라는 인터페이스에 이 단축키를 눌렀을 때 보여지는 화면이다. 인터페이스는 I 모양의 아이콘, 클래스는 C 모양의 아이콘으로 나온다.


Ctrl+O 클래스 멤버 함수 보기

    이 단축키는 파일 내에 선언되어 있는 모든 클래스와 모든 인터페이스들에 내부에 선언된 모든 멤버 함수들을 보여준다. 아래는 그 예시이다.



편집 단축키

Alt+Shift+A 상하 편집 모드로 전환

   종종 한 줄이 아니라 여러줄에 걸쳐 선언되어 있는 클래스 명이나 변수명만을 선택적으로 복사하고 싶을 때가 있다. 이럴때 이 단축키를 누르고 블럭을 선택한 후 Ctrl+C를 하고, 다시 이 단축키를 눌러서 상하 편집 모드에서 나온 후에 붙여 넣기를 하면 블럭 내에 선택되었는 부분만 복사가 된다.



Ctrl+Shift+X 선택된 문자열을 대문자로 전환

    선택한 문자열을 대문자로 전환해 주는 단축키이다. 보통은 일반 변수로 선언했다가 enum 타입 또는 상수로 선언을 바꾸고자 할 경우에 유용하다.


Ctrl+Shift+Y 선택된 문자열을 소문자로 전환

    선택한 문자열을 소문자로 전환해 주는 단축키이다. Java의 일반적인 명명법으로는 클래스는 대문자로, 인스턴스명은 소문자로 시작된다. 그런데 보통은 클래스명의 첫머리를 소문자로 한 명칭을 인스턴스명으로 사용하는 경우가 많다. 가령 TcpCommunication 클래스의 인스턴스명은 보통 tcpCommunication이라는 식이다. 이런 경우 클래스명을 복사하여 붙여 넣은 후, T를 선택하고 이 단축키를 누르는 식으로 사용한다. 이 단축키는 위에서 소개한 상하 편집 모드로 변환 단축키(Alt+Shift+A)와 함께 사용했을 때 더 강력하다. 즉 상하 모드에서 여러줄에 걸쳐 선언된 클래스명을 복사해서 붙인 후 이 단축키로 첫머리를 소문자로 변환하면 금새 인스턴스명으로 변환된다.



리팩토링 단축키

Alt+Shift+S R Getter/Setter 자동 생성 창 열기

    Getter / Setter를 자동 생성해주는 창을 여는 단축키이다. Getter와 Setter를 여럿 만들어야 하는 경우에 유용하게 사용할 수 있다.

Alt+Shift+M Method로 추출

    소스 코드를 블럭 선택 한 후 이 단축키를 누르면 메소드 생성 창이 뜬다. 메소드 명과 변수명을 적절히 입력하고 나면 입력한 메소드 명의 메소드가 생성되고, 선택한 소스는 그 메소드 내로 이동하며, 기존 소스가 있던 자리는 메소드 콜로 대체된다.


Alt+Shift+I Method를 인라인 하기

    Method로 추출 단축키의 반대이다. 메소드에 커서를 놓고 이 단축키를 누르면 이 메소드를 사용하고 있는 모든 곳에 메소드 내의 소스 코드가 삽입되고, 메소드는 삭제된다.


기타 단축키

Ctrl+W 현재 파일 닫기

    편집하고 있는 파일을 닫는다.

Ctrl+Shift+W 열린 파일 모두 닫기

    종종 편집하기 위해 열어 둔 파일이 너무 많은 경우가 있다. 이 때 이 단축키를 누르면 모든 창이 닫힌다. 닫히기 전에 저장이 안된 파일에 대해서는 저장하라고 경고 창을 띄워 주기 때문에 안전하게 사용할 수 있다.

Ctrl+F11 최근 실행 파일 실행

    최근에 실행했던 프로그램 실행 파일을 실행해 준다. 만약 현재 편집 중인 파일에 main() 메소드가 있을 경우 현재 파일을 실행한다.(최근 실행 파일과 현재 파일 중 어떤 것을 실행할지를 선택할 수 있는 옵션이 있다.)

Alt+Shift+ X T Unit Test 실행

    유닛 테스트를 작성하여 사용하는 경우에 유용한 단축키이다. 이 단축키는 여러모로 유용한데, 테스트 파일 전체를 실행하고 싶으면 그냥 이 단축키를 누르면 된다. 만약 특정한 한 개의 유닛 테스트 함수만을 실행하고 싶다면 함수를 드래그 해서 선택하고 이 단축키를 누르면 그 테스트 함수만 실행된다. 만일 특정 패키지를 실행하고 싶다면 Package Explorer 창에서 패키지를 선택하고 이 단축키를 누르면 된다. 또 전체 프로젝트에 대한 테스트를 하고 싶다면 프로젝트를 선택한 후 단축키를 누르면 된다.


Ctrl+ + / - 텍스트 에디터 폰트 크기 조절

    이 단축키는 내 경험상 Eclipse 최신 버전인 Neon에서만 동작한다. 종종 텍스트 폰트 크기를 손쉽게 변경하고 싶을 때가 있다.(세미나나 강의를 위해서 프로젝터를 사용하게 될 경우 특히 그렇다) 이 때 이 단축키를 사용하면 폰트 크기가 조절된다. 텍스트 에디트 창에서만 실행 가능하다.


사용자 지정 단축키

Eclipse에서는 다양한 커맨드에 대해서 사용자가 직접 단축키를 지정할 수 있다. 아래는 단축키로 지정해 두면 도움이 되는 것 들이다.

Ctrl+Shift+P 새로운 패키지 생성( New (Package)에 대해서 )

    새로운 패키지를 생성하는 단축키이다. 기본적으로는 지정이 안되어 있다. 따라서 Preferences / General / Keys 에 들어가서 검색창에 package를 입력한다. 그러면 그 중에 창 모양 아이콘과 함께 "New (Package)" 라는 것이 있을 것이다. 그것을 선택한 후 Binding 입력란에 이 단축키를 입력한다. 그리고 When 란에는 In Windows를 선택한다. 그러면 이후 새로운 패키지를 추가할 때 이 단축키만 누르면 패키지 생성창이 뜬다.


Ctrl+Shift+M 새로운 클래스 생성

    위와 비슷하게 새로운 클래스를 생성하기 위한 단축키이다. Preferences / General / Keys에 들어가서 검색창에 class를 입력한다. 그 중에서 "New (Class)"를 선택한다. 만약 Java와 C/C++을 동시에 사용하는 경우라면 Java 클래스를 생성하고 싶다면 "New (Class (org.eclipse.jdt.ui.....)"로 되어 있는 것을 선택하고, C++ 클래스를 생성하고 싶다면 "New (Class)"를 선택하면 된다. 그리고 위와 비슷한 방법으로 단축키를 입력하고 When란에 Java는 Editing Java Source를, C++은 In C/C++ Views를 선택한다. 이후에 클래스를 생성할 때 이 단축키를 입력하면 클래스 생성창이 뜰 것이다.


Posted by 이세영2
,