오늘은 자바 프로그램의 기본 구조에 대해서 정리해보려고 한다.
오늘 설명하는 내용은 기본적인 내용이기도 하지만, 면접질문에도 많이 나오고, 객체지향에 대한 중심이 담겨 있다고 생각한다.
얼핏하면 헷갈리는 것들도 정리해서 잘 기억할 수 있도록 해야겠다.
자바 프로그램의 기본 구조
우리가 자바 코딩을 하기 위해 무언가를 추가할 때, 많은 선택지가 있다.
Class, Interface, Enum, Annotation 까지...
Class와 Interface 까지는 들어봤어도 Enum? Annotation?? 할 수도 있을 것 같다.
하지만 그리 어렵지는 않은 개념들이니 정확히 알아두고 활용해보는 게 좋을 것이다.
1. Class
첫 번째로는 자바를 처음 배우게 되면 맞이하게 되는 클래스이다.
클래스는 우리가 흔히 만드는 변수, 메소드들의 집합체라고 할 수 있다.
class Home{
String name = "SweetHome";
int room = 3;
public void buildHome() {
System.out.println("complete");
}
}
왜 클래스가 설계도인지는 위에 코드를 보면서 설명해보겠다.
Home 이라는 클래스가 있는데, 방 갯수, 집 이름 등을 입력해 설계를 한다고 볼 수 있는 것이다.
이렇게 코드를 쳐서 만들어 놓은 것들을 객체라고 부를 수 있는 것이고, 이를 실행 시키면(메모리에 할당 되면) 인스턴스라고 할 수 있는 것이다.
*** Abstract Class (추상 클래스)
클래스 중에서는 추상 클래스라고 하는 것도 있다.
추상 클래스를 위에 설명한 내용을 곁들여 설명하자면 미완성인 설계도라고 생각하면 된다.
상속을 통해 자식 클래스에서 구체적으로 구현하고 사용 할 수 있다.
abstract class Home{
String name;
int room;
public abstract void buildHome() {
}
}
위와 같이 abstract 키워드를 사용해서 추상 클래스와 추상 메소드를 만들어 설계도의 기초를 잡을 수 있다.
이 추상 클래스는 상속(extends)을 통해 자식 클래스들에서 같은 기능을 사용하고 싶고 또 거기서 기능을 확장 시키고 싶을 때 사용한다.
***
2. Interface
이번에 설명할 것은 인터페이스이다.
인터페이스는 위에서 설명한 추상 클래스와 비슷한 기능을 한다.
예제를 보면서 설명하면 더 잘 이해될 것이다.
public interface MemInf {
public void buildHome(String name);
}
위와 같이 코드를 작성 할 수 있는데, 위에 추상 클래스와는 많이 다른 모습일 것이다.
인터페이스를 쉽게 말하자면 기본 설계도를 만드는 것이고, 상속(implements)을 통해 꼭 필요한 메서드를 구현하게 할 때 쓴다.
그럼 추상클래스와 인터페이스의 다른 점은 무엇일까?
추상클래스는 하나의 상속관계만을 가질 수 있고(단일 상속), 인터페이스는 여러개를 상속 할 수 있다.(다중상속)
이렇게만 말하면 '그래서 어떤 용도에 저걸 쓰는건데?' 라는 생각이 들 것 같다.
생명체를 예로 들어볼 것이다.
생명체는 인터페이스로 만들 수 있다. 시간이 지날 수록 나이가 들고, 키나 크기의 변화가 이루어진다. (전부 공통적이고 필수적임)
이 하위에는 동물과 식물이 있을 수 있다. 각각의 동물들과 식물들은 같은 기능을 한다.(동물은 소화를 하고, 식물은 광합성을 함)
이를 추상클래스로 만들면 동물들에 대한 기능을 작성할 수 있고, 확장을 통해 기능을 추가 할 수도 있다.
이렇게 해도 완전히 이해가 되지 않을 수도 있다. 그럴 때는 한번 직접 상속관계를 만들어보면서 사용해보면 이해가 될 것이라고 생각한다.
3. Enum
세번째로 설명할 내용은 enum이다.
enum은 열거형이라고 불리는데, 서로 연관된 상수들의 집합이라고 생각하면 된다.
만약 안드로이드 코딩을 해봤다면 많이 봤을 것이라고 생각한다. (ex_ Color.RED, Color.BLUE 등등)
약간 그런 느낌의 클래스가 바로 enum 이다. 한번 코드를 보자.
enum Color {
RED, BLUE, YELLOW;
}
생긴 모습은 생각보다 더 간단하다. 얼핏 보기엔 저게 클래스야 싶겠지만 정말 클래스이다.
정말 열거만 하면 되기에 사용법도 간단하고, 코드도 간결해지며 인스턴스 생성과 상속을 방지(간단하게 메모리 절약)도 가능하다.
4. Annotation
마지막으로 어노테이션이다.
어노테이션이 뭔지 모르는 이들을 위해서 간단하게 말하자면 @뒤에 붙는 설명 같은 느낌이다.
위에 설명한 클래스를 상속받아 어노테이션을 사용해보겠다.
public class Sub extends Home {
@Override
public void buildHome() {
}
}
상속을 받은 메소드라는 뜻이며, 이를 지워도 상관은 없지만 코드의 가독성을 높이고 효율성도 증가시킨다.
코드를 실행 시킬 때, 원하는 곳에 직접 어노테이션을 적용시킴으로써 데이터를 매핑하거나, 프로그램에게 알려줄 수도 있다.
이를 가장 효율적으로 사용할 수 있는 곳이 Spring FrameWork다.
나중에 자바를 전부 정리하고 나서 넘어갈 곳이 바로 스프링이기에 그 때가서 자세히 다뤄보도록 할 것이다.
이렇게 자바에서 생성할 수 있는 기본 요소들에 대해서 좀 알아보았다.
다음으로는 클래스에 구조에 대해서 알아 볼 것이다.
일단 예시 코드를 하나 작성해 보겠다.
public class Home {
// 필드
static String name = "SweetHome"; // 멤버변수 (클래스 변수, 전역 변수, 공유 변수)
int room; // 멤버변수 (인스턴스 변수)
// 생성자
public Home() {
}
// 메소드
public void buildHome() {
String com = "complete"; // 지역변수
System.out.println(com);
}
}
필드란 클래스에 포함된 변수를 의미한다.
변수를 어디서 생성하느냐에 따라서 멤버변수와 지역변수로 나눌 수 있다.
위에 예를 보면 알 수 있다시피 클래스 안에서 생성한 변수는 멤버변수, 메소드 안에서 생성한 변수는 지역변수이다.
멤버변수는 클래스 변수와 인스턴스 변수로 나누어진다는데, 클래스 변수는 static이 붙은 변수고 인스턴스는 그렇지 않은 변수이다.
전에 static에 대해서 정리했다 싶이 static은 공유를 할 수 있기에 전역 변수, 공유 변수 라고도 불린다.
*** 알아두면 좋은 것
지역변수는 블록 내에서 선언이 되면, 인스턴스 변수는 인스턴스가 생성될 때(new 사용), 클래스 변수는 클래스가 메모리에 올라갈 때 생성된다.
지역변수는 블록(해당 메소드 중괄호)를 벗어나면, 인스턴스 변수는 인스턴스가 소멸하면, 클래스 변수는 프로그램이 종료되면 소멸 하게된다.
지역변수는 스택영역에, 인스턴스 변수는 힙 영역, 클래스 변수는 메소드 영역에 올라간다.
(여기서 클래스 변수는 아래 글에서의 static 변수라고 생각하면 된다.)
자세한 내용은 static 글에 대해서 살펴보면 좋을 것 같다.
***
이렇게 자바의 프로그램의 기본 구조에 대해서 알아보았다.
이번 내용들은 이렇게 정리하지 않았으면 계속 헷갈려했을 것 같다.
앞으로도 계속 기초를 다져나가야겠다고 생각한다.
참고 -
'언어 > Java' 카테고리의 다른 글
[Java] 컬렉션 프레임워크 (0) | 2022.03.20 |
---|---|
[Java] - Lambda 표현식과 Stream (0) | 2022.03.20 |
[Java] - 자바란? (0) | 2022.03.20 |
[Java] Overriding, Overloading (0) | 2022.03.20 |
[Java] 접근제어자(제한자) (0) | 2022.03.20 |