자바의 클래스

Jeong Gyejin·2023년 2월 22일
0

JAVA

목록 보기
6/18

자바의 클래스란?

자바의 클래스는 다음과 같이 정의를 할 수가 있습니다.

  • 변수(데이터, 속성)와 메소드(행위)를 가지고 있는 집합을 이야기함.
  • 객체를 생성하기 위한 틀.
  • class 키워드로 정의하고, new 연산자를 통해서 인스턴스를 생성함.
  • 자바는 클래스들의 모임으로 이루어져있음.

클래스에서 객체를 생성하는 과정을 인스턴스화라고 하며, 생성된 객체를 인스턴스라고 한다!

ex) 붕어빵을 만들기 위해서는 붕어빵 틀이 필요한데, 여기서 붕어빵 틀이 class가 되며, 이 붕어빵틀로 인해 만들어진 붕어빵들을 Object(객체)라고 합니다.

public class fishBread{
	private String ingredient = "beans";
	
	public void makeBread(){
	System.out.prinln("make fishBean Using "+ingredient);\
}
	public static void main(String[] args){
	fishBread fish = new fishBread();
	fish.makdBread();
	
	}
}

1. 객체 변수

클래스 내부에서 선언된 변수를 의미하며, 위 fishBread클래스에서 선언된 ingredinet를 의미합니다.

이러한 객체변수는 객체를 선언하고, 연산자를 이용해서 접근을 할 수 있습니다.

2. 메소드(method)

클래스 내부에 있는 객체 변수에 연산자를 이용해서 접근을 할 수 있으며, 연산자를 이용하여 직접적으로 변수에 접근하는것이 아니라, 메서드를 이용하여 값을 초기화 하고, 값을 가져올 수 있습니다.

public class fishBread {    
    private String ingredient;
    
    public void setIngredient(String ingredient) {
        this.ingredient = ingredient;
    }
    
    public String getIngredient() {
        return this.ingredient; 
    }
    public static void main(String[] args) {
        fishBread fish = new fishBread();
        fish.setIngredient("bean");
 
        System.out.println(fish.getIngredient());
    }
}

생성자

자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화 할 수 있는 생성자라는 메소드를 제공합니다.

생성자의 특징

  • 생성자는 반환값이 없지만, 반환타입을 위한 void형으로 선언하지 않음.
  • 초기화를 위한 데이터 인수로 전달받을 수 있음.
  • 객체를 초기화하는 방법이 여러개 존재할 경우, 하나의 클래스가 여러 개의 생성자를 가질 수 있으며, 메소드 오버로딩이 가능함.
class Car {

    private String modelName;
    private int modelYear;
    private String color;
    private int maxSpeed;
    private int currentSpeed;

 

    Car(String modelName, int modelYear, String color, int maxSpeed) {
        this.modelName = modelName;
        this.modelYear = modelYear;
        this.color = color;
        this.maxSpeed = maxSpeed;
        this.currentSpeed = 0;
    }

    public String getModel() {

        return this.modelYear + "년식 " + this.modelName + " " + this.color;

    }

}

 

public class Method01 {

    public static void main(String[] args) {

        Car myCar = new Car("아반떼", 2016, "흰색", 200); // 생성자의 호출

        System.out.println(myCar.getModel()); // 생성자에 의해 초기화되었는지를 확인함.

    }

}

기본생성자

자바의 모든 클래스에는 하나 이상의 생성자가 정의되어 있어야 하지만 자바 컴파일러가 기본 생성자를 기본적으로 제공해 주기 때문에 생성자를 정의하지 않고도 인스턴스를 생성할 수 있습니다.

  • 기본 생성자는 어떤 매개변수도 전달받지 않음.
  • 하지만 여러개의 매개변수를 가진 생성자를 만들 경우에는 매개변수를 받는 기본 생성자를 만들어서 호출해함.
class Car {

    private String modelName;
    private int modelYear;
    private String color;
    private int maxSpeed;
    private int currentSpeed;Car(String modelName, int modelYear, String color, int maxSpeed) {

        this.modelName = modelName;
        this.modelYear = modelYear;
        this.color = color;
        this.maxSpeed = maxSpeed;
        this.currentSpeed = 0;

    }

 

    public String getModel() {
        return this.modelYear + "년식 " + this.modelName + " " + this.color;
    }
}

 

public class Method04 {

    public static void main(String[] args) {

			  Car myCar = new Car("아반떼", 2016, "흰색", 200); // 생성자의 호출

        System.out.println(myCar.getModel()); // 생성자에 의해 초기화되었는지를 확인함.

    }

}

접근제어자란?

각 멤버변수들의 고유성격을 파악하여 외부에서 접근해야할 바운더리를 성격에 맞게 오픈해주어야 할 때 사용합니다.

  • private: 자기 자신 클래스에서만 접근이 가능.
  • default: 특정 제어자를 선언하지 않는 경우 default로 세팅이 되며, 동일 패키지에서 사용이 가능.
  • protected: 동일 페이지, 자식 클래스에서 사용이 가능함.
  • public: 접근 제한이 없음.

클래스 내부

클래스 내부에는 클래스 변수와 인스턴스 변수로 나누어집니다.

1. 클래스 변수

  • 클래스 내에서 static을 붙여서 선언한 변수를 의미하며, 정적인 변수라는 특징이 있음.
  • 이 클래스의 특징은 클래스가 여러 인스턴스로 선언되어도 동일한 값을 가져옴.
  • 서로 다른 어느 객체에서 static변수에 접근하여 값을 바꾼다면 생성된 모든 객체 내부의 static변수는 값이 동일하게 바뀜.
  • 즉, static변수는 생성된 모든 객체에서 공유.
public class exstaticVar {
 
    public static String testVar = "test";
 
    public static void main(String[] args) {
        exstaticVar test1 = new exstaticVar();
        exstaticVar test2 = new exstaticVar();
        
        System.out.println(test1.testVar);
        
        test2.testVar = "change test";
        
	        System.out.println(test1.testVar);// change test
    }
}

2. 인스턴스 변수.

  • 클래스 변수의 반대로 객체가 생성되면 해당 객체에 종속되기 때문에 각 개체별로 별도의 값을 지님.
    public class student {
        public int regStudentNum=0;
     
        public static void main(String[] args) {
            student 영수 = new student();
            student 민수 = new student();
            
            영수.regStudentNum++;
            민수.regStudentNum++;
            
    	      System.out.println(영수.regStudentNum);  // 1
        }
  • 인스턴스 변수는 각 객체별로 고유한 값을 지정해야할때 사용함.
    public class student {
        public static int regStudentNum=0;     // 등록된 학생수는 객체수가 증가할때마다 늘려야 하기 때문에 static변수로 선언
        public String name;                 // 학생은 각기 고유한 이름을 가지고 있어야 하기 때문에 인스턴스 변수로 선언
     
        public static void main(String[] args) {
            student 영수 = new student();
            student 민수 = new student();
            
            //영수 객체 선언 후 등록 인원 +1, 이름 지정
            영수.regStudentNum++;
            영수.name = "박영수";
            
            //민수 객체 선언 후 등록 인원+1, 이름 지정
            민수.regStudentNum++;
            민수.name = "최민수";
            
            System.out.println(영수.regStudentNum); // 2
            System.out.println(영수.name);  // 박영수
     
            System.out.println(민수.regStudentNum);  // 2
            System.out.println(민수.name); // 최민수
        }
    }

3. 정적 메소드

  • 정적 메소드는 인스턴스 변수를 사용할 수 없으며, static으로 선언된 변수만 사용이 가능함.
  • 사용하는 곳에서 따로 객체 생성없이 클래스명, 메소드명으로 호출이 가능하며 특정한 기능을 담당하는 util성 기능에서 주로 사용이 됨.
    public class calculator {
    public static int sum(int a, int b) {
        return (a + b);
    }
    
    public static int multi(int a, int b) {
        return (a * b);
    }
    
    public static int divide(int a, int b) {
        return (a / b);
    }
    public static void main(String[] args) {
        
        //static 메소드는 객체 생성없이 클래스명.메소드명으로 호출이 가능하다.!!!
        System.out.println(calculator.sum(3, 5));
        System.out.println(calculator.multi(2, 5));
        System.out.println(calculator.divide(20, 5));
    	}
    }

Wrapper(포장) 클래스

자바는 기본타입의 값을 갖는 객체를 생성할 수 있습니다.
기본타입을 객체타입으로 포장해준다는 말입니다.
포장 객체의 특징은 포장하고 있는 기본 타입은 외부에서 변경할 수 없다는 점입니다.
만약 내부의 값을 변경하고 싶다면 새로운 포장객체를 만들어야 합니다.

기본 타입포장 클래스
byteByte
charCharacter
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean

포장 객체는 컬렉션 프레임워크에서 기본타입 값을 객체(Arraylist, Map 등등)로 생성해서 관리할 때 사용합니다.

박싱과 언박싱

기본 타입의 값을 포장 객체로 만드는 과정을 박싱이라고 하고, 반대로 포장 객체에서 기본 타입의 값을 얻어내는 과정을 언박싱이라고 합니다.

기본 타입의 값을 줄 경우문자열을 줄 경우
Byte obj = new Byte(10);Byte obj = new Byte("10");
Character obj = new Character('가');없음
Short obj = new Short(100);Short obj = new Short("100");
Integer obj = new Integer(1000);Integer obj = new Integer("1000");
Long obj = new Long(10000);Long obj = new Long("10000");
Float obj = new Float(2.5F);Float obj = new Float("2.5F");
Double obj = new Double(3.5);Double obj = new Double("3.5");
Boolean obj = new Boolean(true);Boolean obj = new Boolean("true");

생성자를 이용하지 않더라도 다음과 같이 각 포장 클래스마다 가지고 있는 정적 valueOf() 메소드를 사용할 수도 있습니다.
언박싱을 하기 위해서는 기본타입이름+Value() 메소드를 이용해서 메소드를 호출하면 가능합니다.

자동 박싱과 언박싱

기본 타입 값을 직접 박싱, 언박싱하지 않아도 자동적으로 박싱과 언박싱이 일어나는 경우가 있습니다.
자동 박싱은 포장 클래스 타입에 기본값이 대입될 경우에 발생합니다.

	Integer obj  = 100; // 자동박싱

자동 언박싱은 기본 타입에 대해 포장 객체가 대입되는 경우와 연산에서 발생합니다.

	Integer obj  = new Integer(100);
    int value1 = obj;	// 자동 언박싱
    int value2 = obj + 100;	// 자동 언박싱

포장 값 비교

포장 객체는 내부의 값을 비교하기 위해서 == 와 !=을 사용하면 안됩니다.
이 연산자는 내부의 값을 비교하는 것이 아니라 포장 객체의 참조를 비교하기 때문입니다.
그래서 포장 객체의 비교를 위해서는 언박싱해서 비교하거나, equals() 메소드를 이용해서 내부 값을 비교해야 합니다.

profile
항상 더 나은 개발자가 되기 위해서 끊임없이 공부하고 학습하면서 성장하는 사람이 되겠습니다.

0개의 댓글