클래스와 객체

임준철·2021년 4월 11일
0

OOP

목록 보기
1/6

클래스(Classes)와 객체(Object)

클래스 와 객체 개념

클래스

  • 객체를 만들어내기 위한 설계 혹은 틀 또는 객체를 정의해 놓은 것, 코드로 구현한 것을 말한다.

  • 문자열(String)도 클래스 형태로 클래스는 한 번 만든 문자열은 변하지 않는데(Immutable), 클래스는 변할 수 있다.(mutable)

  • 클래스 이름은 PascalCase로 적는다.

  • 변수(attribute, filed, 멤버변수) 와 메소드(method,함수)로 구성된다.

  • 클래스의 로딩되는 시점

    1. 객체가 생성이 될 때 - 클래스가 먼저 클래스 영역에 생성이 되고 그 정보를 가지고 객체가 생성이 되는 것이다.
      초기화 블록을 사용해서 확인해보면 확실히 이해가 간다.
    2. import 할 때 - 클래스가 로딩이 되서 클래스 영역에 생성이 된다.
    3. 정적 변수를 사용할 때 - 클래스명.정적 변수 형태로 사용이 가능하기 때문에 클래스의 정보가 먼저 있어야 한다.
    class Car{ 
        int speed = 0; // 속성, 멤버 변수

        void move(){ //  메소드 (method), 멤버 함수
            speed = 10; //행위를 구현, 속성을 변경
        }
    }

객체

  • 클래스가 구체화하여 값으로 생성된 것(실체화 된 것) 클래스의 인스턴스라고도 부른다.
  • 하나의 클래스로 여러 개의 객체들을 생성할 수 있다. 같은 타입의 독립적인 객체가 된다.
  • new 키워드로 생성된 객체는 힙 영역에 생성이 된다.
  • new 키워드로 생성된 객체는 객체의 주소를 리턴하도록 되어있다.
   Car carOne = new Car(); // new 키워드로 클래스에서 객체 생성
   System.out.println(carOne.speed); // 객체명.으로 속성 접근 가능
   carOne.move(); // 메소드 호출(method call) 이라고 부름.
   System.out.println(carOne.speed);

   Car carTwo = new Car();
   System.out.println(carTwo.speed); // speed=0 독립적인 객체를 의미.

   // STRING은 Immutable이기 때문에 값이 변하지 않지만,
   // 클래스는 대부분 muttable이기 때문에 객체 참조에 대한 문제가 발생한다. 중요**

   Car carThree = carOne; 
   // 참조형 객체이기 때문에 new일때만 새로운 객체를 생성하고,
   // 이렇게하면 같은 객체를 가리킨다.
   System.out.println(carThree.speed);
   carThree.speed = 5;
   System.out.println(carThree.speed);// 5
   System.out.println(carOne.speed); // 5

클래스의 구성요소

필드(속성, 멤버 변수)

  • 필드는 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳이다.
  • 필드는 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다.

메소드

  • 메소드는 객체의 동작을 담당한다. 메소드를 호출하면 중괄호 내의 코드들이 일괄적으로 실행된다.
  • 메소드는 객체 간의 데이터 전달의 수단으로 사용되며, 외부로부터 매개 값을 받을 수도 있고, 실행 후 어떤 값을 리턴할 수도 있다.

생성자

  • 객체 생성시에 초기화를 담당하는 역할을 하고, 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 한다.
  • 생성자는 메소드와 비슷하게 생겼지만, 클래스 이름으로 되어 있고 리턴 타입이 없다.

애노테이션(Annotation)

  • 재정의된 메소드라는 의미로 선언부가 기존의 메소드와 다른 경우 에러가 발생한다.(같게 해줘야 함)
  • 애노테이션은 컴파일러에게 특정한 정보를 제공해주는 역할을 한다.
  • 컴파일 오류를 막아 주고, 컴파일러에게 정보를 전달해 준다.
  • 주로 사용되는 자바에서 제공되는 애노테이션
애노테이션설명
@Override재정의된 메소드라는 정보 제공
@FuctionalInterface함수형 인터페이스라는 정보 제공
@Deprecated이후 버전에서 사용되지 않을 수 있는 변수, 메서드에 사용됨
@SupperessWarnings특정 경고가 나타나지 않도록 함 ex) @SupperessWarnings("deprecations")는 @Depreacted가 나타나지 않도록 함.

Getter와 Setter

  • 클래스의 멤버 변수를 간접적으로 다룰 수 있게 하는 메소드

  • 멤버 변수의 캡슐화를 구현하기 위해 사용. -> 정보은닉 / 보호

  • 멤버 변수의 값을 제한해야 할 때 유용.

     public class Main {
         int x,y;
    
         // 멤버변수를 만들어야 생성가능.
         public int getX() { 
         // 경우에 따라 구현되지 않을 수 있다. 출력하지 않으면 사용 안하는 것.
             return x;
         }
    
         // 들어오는 값에 대해 조건을 걸 수 있다.
         public void setX(int x) {
             if(x > 0 && x <= 1000){
                 this.x = x;
             }else{
                 System.out.println("x should be 1 < x <= 1000!");
                 System.out.println("however, you put in x = "+x);
             }
             this.x = x;
         }
    
         public int getY() {
             return y;
         }
    
         public void setY(int y) {
             this.y = y;
         }
     }
    
     class MainTest{
         public static void main(String[] args) {
             Main m = new Main();
             m.x=10; // x에 private를 넣으면 직접 값을 변경할 수 없음.
             System.out.println(m.x);
    
             m.setX(20);
             System.out.println(m.getX()); //권장된 처리 방식.
    
             m.x = 20; // 권장하지 않는 멤버 변수 처리 방식
    
             m.setX(11111);
             System.out.println(m.getX());
         }
     }

초기화 블록(Initializer)

  • 클래스 또는 인스턴스를 생성할 때 단 한번 실행되는 코드 블록

    public class Main {
      static int classVar;
      static  int instanceCount;
      int instanceVar;
    
      // static initializer
      static { // 객체가 생성되지 않은 상태 객체에서 접근 불가
          System.out.println("static block1");
          classVar = 20;
      }
      // object initialzer 객체를 만들어서 접근.
      {
        System.out.println("block1");
        instanceVar = 30;
        classVar = 50; 
        // 추천되지 않는다. 
        // 객체를 생성하는데 클래스에 대해 변하는것은 권장하지 않음.
        instanceCount++; // 이러한 패턴은 사용된다.
      }
     // 여러개 사용 가능. 스태틱은 스태틱끼리 출력되고, 값은 나중에 선언된 값이 삽입됨.
      static {
          System.out.println("static block2");
          classVar = 5;
      }
      {
          System.out.println("block2");
          instanceVar = 5;
      }
    }
    
    class MainTest{
      public static void main(String[] args) {
          System.out.println(Main.classVar);
          Main m = new Main();
          System.out.println(Main.instanceCount
          System.out.println(m.instanceVar);
          System.out.println(Main.classVar);
          
          Main m2 = new Main();
          System.out.println(Main.instanceCount);
          
          Main m3 = new Main();
          System.out.println(Main.instanceCount
       }
    }  
profile
지금, 새로운 문을 열자! 문 저편에 무엇이 있을지 두렵더라도!!

0개의 댓글