프로그래밍/Java 정리

Java 7일차 -클래스

윤도ri 2021. 11. 24. 19:46

>storage Class(저장 기억 부류)

      지역 변수 : 메소드 내부에 선언된 변수// 갈색 (매개변수도 지역변수의 일종)
      전역 변수 : 클래스 내부에, 메소드 바깥에 선언된 변수// 파란색
      정적 변수 : static이 붙은 변수 // 살짝 기울어짐

  지역 변수 전역 변수 정적 변수
초기화 직접 자동 자동
생명주기 } 프로그램 종료시 프로그램 종료시
접근성

 지역변수는 초기화를 직접 하지 않으면 오류가 생긴다. 또한 중괄호 안에서만 유효하며 나가게 되면 초기화가 된다. 그러므로 접근성이 가장 낮다. 두 번째는 전역 변수인데 초기화를 컴퓨터가 자동으로 해줘서 우리가 할 필요가 없다. 또한 큰 특징이 전역 변수라서 메서드 안에서 사용이 가능하지만 정적 메소드(static 메소드) 안에서는 사용할 수 없다. 

마지막으로 정적 변수는 클래스 메소드 안에 모두 접근이 가능하다. 

 

>클래스

 반복되는 기능(행동)을 관리하기 위해 만들어진 것이  메소드이며 반복되는 숫자를 관리하기 위해 있는 것이 변수이다.

그래서 여러 변수들과 메소드들을 둘 다 관리하기 위해 설계하고 사용하는 것이 클래스이다. 

:공통 요소들을 추상적으로 묶어놓은 틀(ex:붕어빵 틀)

예를 들어 자동차는 추상적인가? 김땡땡씨의 빨간색 현대자동차 이런 식으로 구체화되어있지 않다면 실체가 있더라도 

추상적이라고 말할 수 있다.

 

>>클래스의 특징

1.주어이다.

      System.out.println();
 :모든 문장 맨 앞에는 클래스가 나오고 영어는 맨 앞을 항상 대문자로 적는다. 
  따라서 클래스는 주어이고, 대문자로 시작한다.
      String food ="banana";  
      Monkey.eat(food);
     [주어] [동사] [명사]
   (=클래스는 주어이며 메소드는 동사이며 변수는 명사이다.)

 

2.타입이다.

:클래스는 추상적인 개념이고 이 클래스 안에는 필드가 존재한다. 추상적인 것을 바로 사용할 수 없기 때문에 그 필드들을
구체화시킨 대상이 필요하다. 이러한 것들을 "객체"라고 부르고, 영어로는 instance variable이라고 부른다.

:instance 예,예시라는 뜻이고 추상적인 개념의 한 예시로서 객체가 나오기 때문에 instnance variable 이라 부른다.
         (자동차인데 예를들어 내차 말이야)
          [클래스]                [객체]

 

:추상적인 개념인 클래스를 객체로 구체화 해서 만드는 작업을 객체화라고 한다. 
            클래스명 객체명;
                   int data; 
따라서 클래스는 이 때 만들어지는 객체의 타입이다.

 

> 클래스 선언

:다른 클래스 외부에서 선언한다.

    class 클래스명{
        필드(변수, 메소드})
          }

 

>클래스 사용

:클래스는 추상적인 틀이기 때문에 먼저 객체화를 진행한다.

         클래스명 객체명 = new 클래스명();
         객체.메소드명();
         객체.변수명

-하나의 저장공간에는 단 한 개의 값만 담을 수 있다.
필드에는 여러 가지 값이 존재하기 때문에 필드는 다른곳(heap)에 할당되고, 할당된 필드의 주소 값을 저장하는 것이 객체이다. 

 

>생성자

:클래스명 뒤에 소괄호 
:생성자는 메소드와 똑같은 기능을 가지고 있다. 하지만 객체를 생성해 주고 리턴을 할 수 없기 때문에 메소드라고 부르지 않는다.

(생성자도 기본적으로 호출하면 필드를 만들어주고 그 만들어진 주소를 리턴하도록 내부적으로 개발자가 만들어 놓았다.

근데 이 상태에서 리턴 값을 써버리면 필드로 들어갈 수가 없기 때문이다)


:클래스 선언 시 자동으로 생성자가 하나 만들어지고 코드상에는 나타나지 않는다. 이러한 생성자를 기본 생성자라고 하며, (-->car( ){ }이런 과정을 안 거쳤으므로 자동으로 생성되는것)

만약 직접 생성자를 선언하게 되면 기존에 있던 기본 생성자는 사라지게 된다. 

 

>생성자의 목적

1.클래스의 필드를 똑같이 복사해서 메모리에 할당해주고 할당된 
필드의 주소값을 돌려받기 위함/ 객체화의 목적 

2.호출시 내부의 내용을 수행하기 위함./ 초기화의 목적

 

 

 

<객체화 과정>

자동차라는것을 만들기 위해서는 일단 추상화를 시켜준다음에 구체적으로 특정한 카를 불러와야 한다.

 

1.추상화

 

자동차의 성질(색깔,브랜드,차종),기능(시동켜기,시동끄기)을 적어 주어야 한다. 나중에 다시 쓸 수 있도록....

class car {

String brand;                //<----성질(변수 선언)

String color;

int price;

}

void engineStart( ) {

   System.out.println("시동켜기")    // <-----메소드 생성 

}

void engineStop( ) {

   System.out.println("시동끄기")

}

 

2.메소드가 특정한 클래스 내부에 있으므로  지금 있는 위치로 객체화를 시켜주어야 한다.

 

ex)나 mycar에 대해 설명해주려고 해-->car라는 추상적인 개념을 mycar로 구체화시킨다. 

 

Car mycar = new Car(); // <----생성자 호출이고 값이다.

 

3.클래스를 이용해서 특정 메소드(동작,기능)와 변수(성질)들을 입력해준다. 

mycar.brand = "Ferrari"mycar.color = "Red";mycar.price = 65000;mycar.engineStart();

 

But, 여기서 느낀점이 너무 불편하다.. mycar에 변수들만 해도 3갠데 더 여러개 있으면 어떻게 하나하나

쓸 것 인가..? 더해서 mycar가 아니라 이번엔 momcar라는 객체를 만들려고 하면 어떻게 해결할 것인가..

고민을 조금 해보자면 생성자는 메소드와 같은 성질을 가지고 있다. 그러므로 값을 넣어주기 위해 매개변수를

가지고 와서 호출해주어야 한다. 

Car momcar = new Car("K7","white",7000);

 

이런식으로 호출을 시도했다. 그런데 안되네...??!! 뭣이 문제인가..메소드안에 생성자도 해당 클래스 내부영역을 선언해야한다. 그러므로 class Car 안에 생성자를 선언해준다.또한 선언할때 여러 객체를 받기위해서 this라는 변수를 앞에 써준다.

 

<this란?>

:클래스 선언시 내부적으로 선언되어 생성된다.(말하자면 내장변수라고 말할 수 있겠다.)
 클래스 필드에서 하나의 메소드 선언으로 여러 객체를 다루어야 한다. 만약 메소드 내에서 필드를 사용하고자 할 때 어떤 객체의 필드인지를 알 수 없다. 따라서 객체에 마침표를 찍고 필드에 접근하거나(1.Car mycar= new Car();

 2. mycar.brand = "Ferrari") 어떤 객체를 생성중에는 현재 접근한 그 객체를 this 변수가 받는다. 결과적으로 클래스 선언시 this.필드명으로 접근하면 여러 객체를 하나의 메소드에서 구분하여 다룰 수 있게 된다.(객체 구별용 변수) 

 

 

Car(String brand, String color, int price){

        this.brand = brand;

        this.color = color;

        this.price = price;                    // 메소드가 실행될때 접근한 객체의 필드를 사용하게 된다.

}

 

 

강사님이 만들어주신 그림..그림판 능력자시다..언빌리버블..

<과정 설명>

 

1.new car에서 생성자를 호출한다. 그러면 mycar라는 주소값 100번지를 갖고있는 객체가 만들어진다.

2. 생성자 내부의 값을 메소드 내 매개변수에 전달하는 것을 수행한다.

3.this.brand/this.color/this.price 에 각각 값이 전달된다.

4.호출 했던곳으로 다시 돌아간다.

5.mycar라는 객체에 넣어준다. (1번째 과정 완료)

6.두번째 momcar라는 객체가 만들어진다. 

7.2~6번 과정 반복 

 

 

 

 

'프로그래밍 > Java 정리' 카테고리의 다른 글

Java 실습 : 비지니스 프로그램 만들어보기  (0) 2021.11.26
Java 8일차 -클래스 배열, 상속  (0) 2021.11.25
Java 6일차 -메소드  (0) 2021.11.23
Java 4일차 -for문  (0) 2021.11.23
Java 5일차 -배열  (0) 2021.11.22