본문 바로가기

JAVA

자바 기초(Data Type, Class)

1. 데이터 타입(Data Type)

: 자료형(Data Type)은 변수가 어떠한 자료형으로 쓰일지를 명시적으로 나타내는 기호이다. 비유를 하나 들어보면, 일반적으로 우리는 소주잔에 소주를 맥주 잔에는 맥주를 따라 마신다. 즉, 용도가 정해진 자료형(그릇)에 변수(술)를 담는다고 볼 수 있다. 용도가 정해졌다는 것은 어떠한 값을 변수에 선언할 때 약속되어 있는 자료형(Data Type)을 사용해야 한다는 의미이다.

 

1) 타입 종류

 

 

2) 타입 범위

 

3) 문자열

: 문자열을 표현하는 데이터 타입은 String 이다. String은 기본형 데이터타입이 아닌 참조형 데이터타입인데 현재는 그 의미는 무시하고 String은 문자열을 담는 데이터 타입이라고만 이해하자. 문자열의 메모리 크기는 작성된 글자수에 따라서 정해지게 되고 "가나다라"라는 4개의 글자를 사용하면 char에 해당하는 4개의 문자를 의미하므로 8byte의 메모리를 사용하게 된다.

 

 

2. 클래스(Class)

- 객체지향언어에서는 현실세계를 반영하기 위해 객체(Object)라는 개념을 도입하게 된다. 현실세계에서 보는 사람들, 자동차, TV 등이 객체지향언어에서는 객체로 표현이 된다.

 

- 클래스란 객체를 생성하기 위해 그 객체가 어떤 데이터를 갖고 어떤 연산을 하는지에 대해 정의한다.

 

 

1) 클래스 선언

접근제어자 class 클래스이름 {

    접근제어자 필드1의타입 필드1의이름;

    접근제어자 필드2의타입 필드2의이름;

    ...

    접근제어자 메소드1의 원형

    접근제어자 메소드2의 원형

    ...

};

 

ex) 다음은 Car라는 이름의 클래스를 선언하는 그림이다.

여기서 접근 제어자는 객체 지향 프로그래밍의 특징 중 하나인 정보 은닉(data hiding)을 위한 키워드이다.

public 멤버는 모든 객체에서 접근할 수 있지만, private 멤버는 해당 객체 내의 멤버 변수나 메소드만이 접근할 수 있다.

 

 

2) 인스턴스의 생성

위와 같이 선언된 클래스의 정의를 가지고 다음과 같은 순서대로 Car 객체의 인스턴스를 생성할 수 있다.

 

우선 다음과 같이 객체를 참조하기 위한 참조 변수를 먼저 선언한다.

선언
클래스이름 객체참조변수이름;

예제
Car myCar;

 

그 후에 new 키워드를 사용하여 인스턴스를 생성하고, 해당 인스턴스의 주소를 미리 선언한 참조 변수에 저장하여 사용한다.

 

선언
객체참조변수이름 = new 클래스이름();

예제
myCar = new Car();

 

3) 생성자(Constructor)

: 생성자는 new 연산자를 통해서 인스턴스를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메소드(하지만 메소드와는 다르다.)이다. 생성자는 인스턴스 변수(필드 값 등)를 초기화 시키는 역할을 한다. 

 

생성자 선언 방법

생성자의 정의는 일반 메소드를 정의하는 것과 같지만

 

(1) 반환값이 없다.

(2) 생성자의 이름은 클래스의 이름과 정확히 같아야 한다.

(3) 생성자는 매개변수에 따라 여러개가 정의 될 수 있다.

(4) public이라는 접근제어자여야 한다.

 

4) 생성자 종류 및 사용

위에서 생성자 선언하는 방법을 알아보았다. 인스턴스를 생성할 때 반드시 생성자를 호출한다고 하였다. 그런데 지금까지는 생성자를 정의하지 않았는데 어떻게 호출이 된 것일까? 그 이유는 클래스를 정의할 때 생성자를 생략하면 컴파일러가 자동적으로 기본 생성자(Default Constructor)를 생성하여 주기 때문이다. Default 생성자란 "public 클래스(){ }"를 의미한다. 소스 코드를 통해서 알아보자.

 
public class ConstructorEx01 {
//	public ConstructorEx01(){ } // Default Constructor 자동 생성
	
	public static void main(String[] args) {
		ConstructorEx01 ce = new ConstructorEx01(); // 인스턴스 생성 및 생성자 호출
	}
}

 

위의 내용처럼 인스턴스를 생성할 때 생성자를 호출한다. 생성자를 생략하면 주석 처리된 부분이 자동으로 생성된다. 이번에는 기본 생성자를 직접 정의하는 내용을 알아보자.

 

public class ConstructorEx01 {
	public ConstructorEx01(){ 
		System.out.println("생성자 호출 성공");
	}
	
	public static void main(String[] args) {
		ConstructorEx01 ce = new ConstructorEx01(); // 인스턴스 생성 및 생성자 호출
	}
}

 

처음 예제와 비교하면 생성자를 직접 정의하였고 생성자 내부에 소스코드 한 줄을 추가하였다. 결과는 "생성자 호출 성공"이 출력된다.

 

 

5) 오버로딩(Overloading)

:  1개의 클래스에서 동일한 이름의 메소드 또는 생성자를 여러개 정의하는 것을 의미한다.

 

오버로딩이 성립하기 위해서는 몇 가지 조건이 필요하다. 우선 위에서 설명했듯이 동일한 이름을 갖고 매개변수의 자료형, 개수, 순서를 다르게 하여 선언하여야 한다.

 

왜 오버로딩을 사용해야 할까?

 

오버로딩을 하는 이유는 동일한 기능의 메서드를 정의할 때 다양한 입력값(매개값)을 받기 위해서이다. 프로그램이 거대해지면 메소드 또한 많아진다. 이때 동일한 기능의 메소드를 매개값에 따라 다르게 이름을 정의하면 복잡하고 관리하기가 어려울 것이다. 생성자 또한 외부로부터 입력되는 다양한 값으로 초기화를 하기 위해서 사용된다.

 

ex)

public class OverloadingEx01 {
	
	public void add(int a, int b) {
		System.out.println(a+b);
	}

	public void add(double a, double b) {
		System.out.println(a+b);
	}

	public void add(int a, double b) {
		System.out.println(a+b);
	}

	public static void main(String[] args) {
		OverloadingEx01 ol = new OverloadingEx01();
		ol.add(1, 2);
		ol.add(2.5, 8);
		ol.add(3, 5.5);
	}
}

 

add라는 메소드 3개를 매개변수를 다르게 하여 정의하였다. main 메소드에서 인스턴스를 생성하고 각각 매개값을 전달하여 해당 메소드를 호출하고 값을 출력하였다.

 

public class OverloadingEx02 {
	// 전역변수
	String name;
	String company = "apple";
	String model = "iPhone7";
	String number = "비공개";
	// 생성자
	public OverloadingEx02(String name) {
		this.name = name;
	}
	// 생성자 오버로딩
	public OverloadingEx02(String name, String number) {
		this.name = name;
		this.number = number;
	}
	// 메소드
	public void print() {
		System.out.println("이름 : " + name + "\n회사/모델명 : " + company + "/" + model
				+ "\n전화번호 : " + number);
	}
	
	public static void main(String[] args) {
		OverloadingEx02 ol = new OverloadingEx02("joker"); // 첫번째 생성자 호출
		ol.print();
		System.out.println();
		OverloadingEx02 ol2 = new OverloadingEx02("bat", "010-0101-1234"); // 두번째 생성자 호출
		ol2.print();
	}
}

 

 전역변수를 정의하고 생성자의 매개변수를 다르게 하여 정의하였다. print 메소드에서는 해당 데이터를 출력하도록 하였다. main 메소드에서 인스턴스를 각각 생성하여 매개값을 전달하여 전역변수를 초기화한 후 print메소드를 호출하여 해당 내용을 출력하였다. 

 

'JAVA' 카테고리의 다른 글

자바 기초(상속_다형성)  (0) 2022.02.21
자바 기초(상속)  (0) 2022.02.21
자바스크립트 기초(내장 객체)  (0) 2022.02.18
자바 기초(배열)  (0) 2022.02.18
자바 기초(Static)  (0) 2022.02.18