<14:30 5교시>

객체는 필드(field : data의 저장소)+메소드(method: 기능)

오전에 배운거는 필드에 값을 저장하는 방법, 오후에 배울건 메소드 작성 방법

자바에서는 메소드 자바스크립트에서 함수가 그랬던것처럼 단독으로 존재할 수 없다.

메소드는 반드시 클래스 객체 안에 존재하게 된다.

 

객체를 리모컨에 비유하자면

리모컨의 버튼의 각 기능만큼 메소드를 가지고 있다고 할 수 있다.

그리고 버튼 기능이 작동할 수 있게 해주는 모든 것을 필드라고 할 수 있다.

그리고 필드에 해당할 건전지나 회로 같은 것은 공개여부에 따라 public 이나 private이라고 부른다고 함.

 

 

 

 

<15:30 6교시>

더보기
package test.mypac;
/*
 * class의 역할
 * 1. 객체의 설계도 역할
 * 	-객체는 heap 영역(사물함)에 들어있는 물건이라고 생각한다
 * 	- class를 이용해서 객체를 원하는 시점에 원하는 갯수만큼 만들어낼수있다
 * 	- 만들어진 객체가 어떤 저장소와 어떤 기능을 가지게 할지 class로 설계 할 수 있다
 * 2. data type의 역할
 * 3. static 필드와 메소드를 포함하는 역할
 */
public class Car {
	//데이터의 저장소(field): 필요한 정보들이 담길 공간
	public String name;//String type은 선언만하고 값을 넣지 않으면 객체 생성시 null로 초기화 됨
	public int price;//int type은 선언만하고 값을 넣지 않으면 객체 생성시 0으로 초기화됨

	
	//기능(method)
	public void drive() {
		System.out.println(this.name+"이(가) 달려요!");
		Car a= this;//바로 Car 클래스로 생성된 객체의 참조값, 그래서 Car type
	}
	//this.을 작성하는 것은 나 자신의 id 값을 참조할 거라는 얘기인데
	//아직 이 단계에서는 this=id 값이 실제 뭔지는 모른다.
	//이게 메인 클래스에서 메소드가 실행될 때 비로소 id 값이 부여돼서 알 수 있다는 얘기
	
}

 

 

 

 

자바는 객체 지향 언어

자바에서 무언가 하고 싶을 때는 객체들의 메소드를 호출한다.

우리는 객체들의 도움을 받아 목적을 달성할 것이다.

 

자바를 배운다는 것은, 어떤 작업을 위해 무슨 개체의 도움을 받아야할지를 학습하는 것이다.

 

메소드를 호출한다는 의미

더보기
package test.main;

import test.mypac.Car;

public class MainClass05 {
	public static void main(String[] args) {
		Car car1=new Car();
		car1.drive(); //객체를 생성하고 메소드를 여러번 필요할 때마다 호출할 수 있음
		
		new Car().drive();//Car 객체를 생성해서 메소드를 호출하고 참조값은 더이상 사용할 수 없다.
		//1회용으로 사용하고 버리는 메소드 호출 방식
		
		
	}
}

 

오.. 샘한테 오늘의 운세 클래스 메서드 받음 ㅎㅎ 개꿀 넘 재밌다 ㅎㅎ

 

 

 

<16:30 7교시>

package test.mypac;

public class MyUtil {
	//data type 앞에 static 예약어를 붙여서 static 필드를 만들 수 있다.
	//필드는 선언시에 초기값을 넣어줄수도 있다.
	public static String version="1.0";
	
	//method의 return type 앞에 static 예약어를 붙여서 static 메소드를 만들 수 있다.
	public static void send(){
		System.out.println("전송합니다");
	}
}

 

static 필드를 사용하면 new 클래스명(); 을 할 필요가 없다.

static은 용도가 한정적이다.

더보기
package test.main;
/*
 * [static]
 * - static 예약어를 붙여서 필드나 메소드를 정의하면 클래스와 함께 static 영역에 만들어진다.
 * - static 필드나 메소드를 사용할 때는 클래스 명에 . 점을 찍어서 사용하면 된다.
 * 
 * MyUtil.version // static 필드 참조
 * MyUtil.send() // static 메소드 호출
 */
import test.mypac.MyUtil;

public class MainClass07 {
	public static void main(String[] args) {
		//MyUtil 클래스의 static 메소드 호출
		MyUtil.send();
		//MyUtil 클래스의 static 필드 참조
		String a =MyUtil.version;
	
	}
}

 

이해 안돼서 챗 지피티한테도 물어봄

 

static 예약어가 붙은 필드가 "static 영역에 저장된다"는 말은, 그 필드가 클래스 수준에서 관리되고, 객체 인스턴스와는 독립적으로 존재한다는 뜻입니다. 자바에서 static은 클래스의 모든 객체가 공유하는 변수나 메서드를 만들 때 사용되며, 이것은 메모리 관리와 관련이 있습니다. 이를 좀 더 자세히 설명드릴게요.

1. 객체와 클래스

  • 일반적으로 클래스의 필드는 각 객체마다 별도로 저장됩니다. 예를 들어, Person 클래스가 있고 이 클래스의 name 필드가 있다면, 각 Person 객체마다 name이 저장됩니다. 즉, name은 각 객체의 고유한 속성입니다.
  • 반면에, static 필드는 클래스의 모든 객체같은 값을 공유합니다. static 필드는 해당 클래스의 모든 인스턴스가 아니라, 클래스 자체와 관련이 있습니다.

2. static 필드

  • static 필드가 선언된 클래스가 로딩될 때, 해당 필드는 클래스의 메모리 영역에 한 번만 할당됩니다. 그 후에는 클래스의 모든 객체가 이 값을 공유하게 됩니다.

예를 들어, 아래와 같은 코드가 있다고 가정해보겠습니다.

public class MyClass {
    static int staticVar = 10;  // static 필드
    int instanceVar = 20;       // 인스턴스 필드
}
  • staticVar는 클래스 MyClass에 속하는 클래스 변수입니다. 이 변수는 객체가 생성되지 않아도 메모리에 할당되고, 클래스가 로드될 때 한번만 초기화됩니다.
  • instanceVar는 각 객체마다 다르게 할당되는 인스턴스 변수입니다.

3. static 영역

자바에서 메모리는 크게 3가지 영역으로 나눌 수 있습니다:

  • 스택(Stack): 메서드 호출 시, 메서드의 지역 변수들이 저장됩니다.
  • 힙(Heap): 객체들이 생성되어 저장되는 영역입니다.
  • 메소드 영역(Method Area): 클래스의 정보(클래스 변수, 메서드 등)가 저장되는 영역입니다.

static 필드는 메소드 영역에 저장됩니다. 메소드 영역은 클래스가 메모리에 로드될 때, 클래스의 정보를 저장하는 곳인데, 여기에 static 필드도 포함됩니다. 클래스가 로드될 때 한 번만 메모리에 올라가며, 그 이후에는 해당 클래스의 모든 객체가 이 메모리 공간을 공유하게 됩니다.

4. 실행 예시

public class MyClass {
    static int staticVar = 0;
    int instanceVar = 0;

    public void increment() {
        staticVar++;  // static 변수 접근
        instanceVar++;  // 인스턴스 변수 접근
    }

    public static void main(String[] args) {
        MyClass obj1 = new MyClass();
        MyClass obj2 = new MyClass();

        obj1.increment();  // obj1의 staticVar와 instanceVar 증가
        obj2.increment();  // obj2의 staticVar와 instanceVar 증가

        System.out.println("obj1 staticVar: " + obj1.staticVar);
        System.out.println("obj2 staticVar: " + obj2.staticVar);
        System.out.println("obj1 instanceVar: " + obj1.instanceVar);
        System.out.println("obj2 instanceVar: " + obj2.instanceVar);
    }
}

출력 결과:

obj1 staticVar: 2
obj2 staticVar: 2
obj1 instanceVar: 1
obj2 instanceVar: 1
  • staticVar는 두 객체 obj1과 obj2가 공유하는 변수이므로, 두 객체에서 staticVar를 증가시키면 같은 값이 두 객체에서 출력됩니다.
  • instanceVar는 각 객체마다 별도로 존재하므로, 각 객체에서 instanceVar는 독립적으로 증가합니다.

5. 정리

  • static 필드는 메소드 영역에 저장되며, 클래스의 모든 객체가 공유하는 변수입니다. 즉, static 필드에 저장된 값은 클래스가 메모리에 로드될 때 한 번만 초기화되고, 객체 간에 값을 공유하게 됩니다.
  • 반면에 인스턴스 필드는 객체마다 별도로 저장되며, 객체가 생성될 때마다 새로운 값이 할당됩니다.

따라서 "static 예약어를 붙인 필드가 static 영역에 저장된다"는 것은, 해당 필드가 클래스의 모든 인스턴스와 공유되는 값으로, 클래스 로딩 시 메소드 영역에 할당되고 이후에는 클래스의 인스턴스와는 독립적으로 존재한다는 뜻입니다.

 

 

우리가 사용하던 System.out.println();에서 System도  static 필드가 정의된 클래스일 뿐이라는것

 

 

public : 접근 지정자

static : static 영역에 올리겠다.

void : 리턴 값이 없다

 

<17:30 8교시>

오늘 배운 내용 정리하고 교재좀 보려고 함.

 

+ Recent posts