TIL | 22/07/19

개뉸·2022년 7월 19일
0

TIL

목록 보기
4/6
post-thumbnail

Class

객체지향 : 프로그램을 구성하느 요소는 객체이며 이것이 상호작용 하도록 프로그래밍 한다
클래스 : 객체를 만들기우해서 반드시 먼저 만들어야함. 객체를 만들기위한 틀.

붕어빵 :객체
붕어빵만드는틀 : 클래스

클래스 선언방법
public class 클래스명 {
......
}

Car c1 = new Car();
이때 new 뒤에 나오는 클래스이름과 같은 이름은 생성자 라고한다.
생성자를 이용해서 메모리에 객체를 만들라는 명령
메모리에 만들어진 객체를 인스턴스 라고도 말할 수 있다.
이렇게 만들어진 객체를 참조하는 변수가 c1 이 된다.

field (속성)

  • 객체의 속성을 정의함. 학생이라는 Class 는 학부,이름,학번 등의 field(속성)을 가짐.
  • java에서 말하는 변수는 3가지가 있는데

필드? 클래스의 구성요소임.

자동차 라는 객체가 있다고 보자.
이 객체는 자동차의 이름, 자동차의 번호를 가지고있고 이렇게 가지고 있는것을
속성
이라고 한다.
자바에서는 이러한 속성을
field(속성)
이라고 한다.

예를들면 학생이라는 객체는 어떤 field(속성)을 가지고있을까?
학번,이름,전공 이런게 있겟지
한반에 학생이 20명있다면 20개의 학생 개체가 있다는말이다.
각각의 객체는 모두 독립적이라서 각자의 속성의 종류는 같아도 속성의 세부 내용이 다를것

field(속성)는 변수를 선언하는것과 비슷하게
타입 필드명
이렇게 선언할 수 있다.
Car 개체는 이름과 번호를 가질 수 있다고 한다면 이름같은경우는 String 타입으로 선언해주는게
적합하겠지?
String name; 이렇게 스트링 클래스로 name 이라는 필드를 하나 선언해보자.
번호는 숫자이니까 정수타입인 int로
int number; 라고 number 라는 필드를 선언해보자.
이제 Car 라는 클래스를 name 과 number 라는 필드를 선언한것이다.

    Car c1 = new Car();
    Car c2 = new Car();

Car라는 개체가 두개 만들어진것. 이제 이 Car 들은 개체마다 name과 number 라는
field(속성)을 가지게 된다.
이 속성에 값을 넣고 싶다면 내가 맘대로 선언한 c1 이라는 래퍼런스를 가지고 점(.) 을 찍어보자
c1. 하면 c1 이라는 참조변수가 참조하는 개체(Car)가 사용할 수 있는 것들을 보여줄거임.
그중에 아까 선언했던 name과 number 가 있을거임.

c1.name = "소방차"; -> c1이 참조하는 개체의 name을 의미이고 이 name에 소방차 라는 값이 들어있음
c1.number = 1234;

c2.name = "구급차";
c2.number = 1111; -> c2가 참조하는 개체의 nubmer를 의미하고 이 number에 1111 라는 값이 들어있음

System.out.println(c1.name); : 소방차
System.out.println(c1.number); : 1234
System.out.println(c2.name); : 구급차
System.out.println(c2.number); : 1111

public class 메인클래스이름 { // Class 영역
	String name; // 인스턴스 변수
    static int number; // 클래스 변수(static 변수)
    
	void 클래스이름() { // Method 영역
    	int hours = 10; // 지역 변수
    }
}
  • 지역 변수 :
    지역 변수는 메서드 내에 {} 블록에서만 사용 가능한 변수다.
    지역 변수는 스택 메모리에 저장된다.
    메서드가 종료됨과 동시에 소멸되기 때문에 재사용이 안 된다.
    또한 스택 메모리에 저장되기 때문에 한동안 사용하지 않는다면 자동 삭제된다.

    --필드 변수--

  • 클래스 변수 :
    클래스 변수는 인스턴스 변수와 다르게 공통된 저장공간을 공유한다.
    따라서 클래스 내에 인스턴스들이 공통으로 값을 공유해야 할 때 static 키워드를 통해 클래스 변수를 선언하게 된다.

  • 인스턴스 변수 :
    인스턴스 변수는 new 생성자() 를 통해 인스턴스가 생성될 때 만들어진다.
    인스턴스는 힙 메모리에 독립적으로 저장되기 때문에, 인스턴스 변수는 사람마다 특징이 다 다르듯 고유한 특성을 정의하기 위해 사용된다.

static

public class staticTest {
  class StaticNumbers {
      int num1 = 100;
      static int num2 = 200;
  }
  
  public static void main(String[] args) {
  }

위 시작 코드를 기준으로 아래 쓰는 것은 public static void main(String[] args) 의 중괄호 { } 안에 쓰겠다.

StaticNumbers sm = new StaticNumbers();
          System.out.println(sm.num1); // 100
          System.out.println(StaticNumbers.num2); // 200
          

num1과 num2의 차이를 알아보겠어?
num1 : 인스턴스를 생성해 연산자를 통해 값을 불러왔다.
num2 : 인스턴스 생성안하고 그냥 막바로 클래스명 StaticNumbers 하고 점 바로찍고 불러왔다.
StaticNumbers 클래스 내에 num2는 스태틱필드로 선언되어있고 num1은 인스턴스필드로 선언돼있다.

이게 'static한 메소드는 Class가 인스턴스화 되지 않아도 사용할 수 있다.' 는 의미다.

sm.num1 = 500;
        sm.num2 = 600;
        System.out.println(sm.num1); // 500
        System.out.println(sm.num2); // 600

자 이번엔 뭘까? num1과 num2가 그냥 객체안에서 만든 변수라서 고유성을 가진다.

StaticNumbers.num1 = 300; // 에러
StaticNumbers.num2 = 400;

이번엔 뭘까? num1은 StaticNumbers 클래스에서 선언될때 스태틱필드로 선언된게 아니라 그냥 인스턴스필드로
선언된거라서 '클래스명.변수이름' 만으로 할 수 없기 때문에 오류가 난거다.
num2는 당연히 StaticNumbers 클래스에서 스태틱필드로 선언한 변수니까 잘나오는거고.

Method(메소드)

메소드는
입력값을 input 해서
무언가를 작용한뒤
결과값을 output 한다. 수학의 함수와 비슷한 개념

입력값=매개변수(Parameter),인자(Argument)
결과값=리턴값

매개변수랑 인자값은 입력값으로 같기는 한데 조금 다름
인자(Argument) : 어떤 함수를 호출시에 전달되는 값을 의미한다.
매개변수(Parameter) : 그 전달된 인자를 받아들이는 변수를 의미한다.

		사물(Class)

상태		 		행동
(=field(속성))	(=Method)	





	자동차

이름				전진
번호				후진

0개의 댓글