1. 클래스(class)란?
자바는 객체 지향 프로그래밍(Object Oriented Programming : OOP) 언어입니다.
객체지향언어에서는 모든 데이터를 객체(object)로 취급하고 객체가 프로그래밍의 중심이 되어야 합니다.
객체란 일상에서 볼 수 있는 사물로 설명할 수 있습니다.
사물의 상태와 행동처럼 객체를 구체화하는 형태의 언어라고 볼 수 있습니다.
여기서 클래스란 이런 객체를 만들어 내기 위한 설계도와 같다고 볼 수 있습니다.
게임으로 예를 들어보면 스타크래프트에 배럭이라는 건물을 보시면 유닛을 찍어내는 버튼이 있습니다.
이 버튼이 마린을 생산해낼 수 있는 설계도입니다.
이 생산 버튼을 통해 마린(객체)를 많이 생산합니다.
자바도 마찬가지로 이런 설계도인 클래스를 이용해 여러 객체를 생성하게 됩니다.
클래스는 기능이라고 할 수 있는 메소드(method)와 필드(field)로 구성이 되는데 필드는 클래스에 선언된 변수를 말합니다.
변수가 메소드내에 선언되어 있다면 그 변수는 메소드것이지만 클래스 내에 선언이 되어있다면 클래스 것입니다.
클래스의 것은 메소드도 활용을 할 수가 있습니다.
배럭의 생산 버튼 즉 클래스에서 생성된 객체 마린은 설계도에 의해 공통적으로 찍히지만 체력의 값은 각 객체마다 따로 가집니다.
마린의 체력은 인스턴스 변수라고 할 수 있습니다.
필드에서 인스턴스 변수는 메모리에 할당된 객체를 의미하며 생성된 인스턴스는 독립된 메모리 공간에 저장된 자신만의 필드를 가질 수 있습니다.
하지만 마린의 기본 공격력은 6이지만 공격력 업그레이드를 하면 모든 마린의 공격력이 올라갑니다.
이런 변수를 클래스(class) 변수라고 합니다.
클래스 변수는 값이 변하면 모든 객체의 값이 같이 변합니다.
클래스 변수는 정의될 때 static int a = 1; 과같이 static이 붙는데요.
그래서 스태틱(static) 변수라고도 합니다.
자 다시 한번 정리해보겠습니다.
필드(field)는 변수를 말합니다.
이런 변수는 선언된 위치에 따라 다른 역할을 하고 다른 이름이 붙습니다.
package com.barracks;
class MakeMarine{
static int MarineHP = 40; //클래스 변수
int MarinePower = 6; //인스턴스 변수
void method(){
int TotalKill = 0; //지역 변수
}
}
위의 예시처럼 메소드 안에 있는 변수는 지역변수라고 부릅니다.
클래스 안, 메소드 밖에 있는 변수를 전역변수라고 부르는데 전역변수는 클래스 변수와 인스턴스 변수가 있습니다.
파라미터와 아규먼트에 쓰이는 변수는 매개변수라고 합니다.
변수가 선언될 때 final이 붙어있으면 상수라고 합니다. 상수는 값이 변하지 않는 고정된 값을 말합니다.
( 변수 / 지역변수 / 전역변수 / 매개변수 / 클래스변수 / 인스턴스변수 / 스태틱변수 / 상수 )
객체의 생성
//클래스이름 객체를참조하는변수이름;
Car myCar;
//객체를참조하는변수이름 = new 클래스이름();
myCar = new Car();
//한줄로 바꿀수있음
Car myCar = new Car();
클래스의 구성요소인 메소드(method)는 기능 쉽게 말해 명령문들의 집합을 말합니다.
메소드는 중복되는 코드의 반복적인 프로그래밍을 방지하기 위해 사용됩니다.
클래스의 구성요소는 메소드와 필드 말고 생성자라는 것이 있습니다.
생성자는 메소드와 비슷하게 생겼지만 또 다른 역할을 합니다.
클래스를 이용해 객체를 생성하면 객체는 즉시 메모리가 할당됩니다.
하지만 필드가 초기화되지는 않기 때문에 생성자를 기본적으로 제공해 주며 변수를 초기화하게 됩니다.
1개 이상의 생성자를 임의로 만들게 되면 자바는 기본 생성자를 제공하지 않게 되며 생성자를 만들지 않을 경우 자바에서 기본 생성자를 제공합니다.
생성자의 조건을 알아보겠습니다.
생성자의 조건
1. 클래스 이름과 동일하되, 리턴타입은 없고, 객체 생성시 접근제한자는 public
class Test{
//기본생성자
public Test(){
}
}
2. 생성자는 객체 생성을 하는 new 키워드와 함께 사용되며, 생성시 단 한번만 자동 호출 된다.
//type 변수 = new 생성자();
Test t1 = new Test();
3. 메소드 처럼 객체 및 클래스명으로 호출될 수 없다.
t1.Test(); // 에러
4. overload 할 수 있다.
class Test{
public Test(){} //기본 생성자
public Test(int a){}
public Test(int a, int b){}
}
5. 생성자를 명시하지 않으면 기본 생성자가 제공되어 멤버변수(필드)를 초기화 하고, 명시된 생성자를 선언하게 되면 명시 생성자만 호출되고 기본 생성자는 제공되지 않는다.
class AAA{} //new AAA();
class BBB{
public BBB(){} //new BBB();
}
class CCC{
public CCC(int a){} //new CCC(); X -> new CCC(10);
}
6. 생성자는 상속되지 않는다.
7. 생성자는 내부 호출할 수 있으며, 키워드는 this()로 사용된다.
8. 생성자의 목적은 객체 생성 및 필드 초기화에 있다.
AAA.java
package com.aaa;
//public class AAA (extends Object) : 자바의 모든 class는 Object를 상속하고 있다!!
public class AAA {
private int abc;
//default constructor(기본 생성자)
public AAA() {
System.out.println("AAA 생성");
}
//필드 초기화 생성자
public AAA(int abc) {
//this : 나(객체)
this.abc = abc;
System.out.println("AAA 생성 -> abc : " + abc);
}
//getter & setter
public int getAbc() {
return abc;
}
public void setAbc(int abc) {
this.abc = abc;
}
public void prn() {
System.out.println("AAA의 prn() 메소드");
}
}
또한 자바의 모든 클래스는 Object 클래스를 상속받고 있습니다.
모든 클래스가 상속받고 있기 때문에 코드에서는 생략됩니다.
this() 메서드는 생성자 내부에서만 사용할 수 있으며 같은 클래스의 다른 생성자를 호출할 때 사용됩니다.
접근제한자 class 클래스명 {
필드01;
필드02;
public 클래스명{} //생성자
method01(){
//구현부
}
method02(){
//구현부
}
}
클래스의 형태는 이렇다고 보실 수 있습니다.
'Java 관련 > Java' 카테고리의 다른 글
[Java] 상속(inheritance) (0) | 2021.11.03 |
---|---|
[Java] 오버로딩(Overloading), 오버라이딩(Overriding) (0) | 2021.11.02 |
[Java] java.lang.String api 활용하기 (0) | 2021.10.31 |
[Java] Split() & StringTokenizer() (0) | 2021.10.30 |
[Java] String() & StingBuffer() (0) | 2021.10.29 |