8:40 경 학원 도착, 주말 동안 사용된 책상 정리하고 9시부터 교재에서 클래스 내용 살펴보기

 

<9:30 1교시> 지난 시간 복습

예약어와 함께 클래스명을 선언하고 소괄호로 열고 닫으면 heap 영역에 객체가 만들어진다.

heap 영역은 '사물함'영역이어서 사물함의 id(참조값, Reference값)가 부여된다. 

대입 연산자를 활용해 데이터타입이 클래스명과 같은 변수를 선언하여 새로운 객체를 담는다.

 

Car car1 = new Car();  → 데이터타입 car1 = 예약어 클래스명
                                   (예약어와 클래스명의 자리는 객체에 부여된 id가 들와서 대체함) 

 

new Car()의 자리에는 heap 영역에 들어가서 부여된 id가 예약어와 클래스명의 자리를 대체한다.

 

객체는 필드와 메소드로 정보를 저장하거나 기능을 가지고 있다.

객체의 필드나 메소드는 설계도에 있는 내용들을 가지고 온 것이다.

객체는 필드에 값을 넣어놓고 활용하거나 메소드를 사용하기 위해서 만들고 사용한다.

 

우리가 필요한 객체를 모두 만들어서 사용하지 않고, 어딘가 미리 준비된 참조값이나 개체를 가져다가 사용하기도 한다.

 

.을 찍었다는 것은 참조값(id)을 불러와서 그 참조값의 객체의 필드 내용을 가져올 때 쓰거나 이미 만들어진 클래스를 참조할 때, 클래스명에 찍어서 클래스의 필드값이나 메소드(함수와는 다른 개념으로 다른 값으로 대체되는 애가 아니여서 호출밖에 못 함.)를 참조하여 가져올 때 사용한다.

 

System.out.println("xxx");

 

System이라는 클래스의 out이라는 필드의 참조값의 println이라는 메소드를 호출하는 코드.

 

Static 필드가 아니면 클래스명에서 바로 호출할 수가 없다.

Static으로 선언되면 클래스와 함께 static 영역으로 올라간다.

Static 영역은 클래스 이름으로 찾아갈 수 있는 영역이고, heap 영역은 참조값으로 찾아갈 수 있는 영역이다.

Static 영역에 올라간 클래스도 필드와 메소드로 이루어져 있는데, static 영역에 올라가 있다는 점과, 앱 전체에서 오로지 한 개의 객체만 이렇게 생겨도 될 때 Static 필드에 넣어놓고 여기저기 사용한다. 

 

System Console 과 연결되어 무언가 출력할 수 있는 기능을 가진 객체를 out이라고 생각하면 된다.

 

Static이 붙어 있으면 실제 사용 가능한 설계도라고 생각하면 되고, static이 없으면 이제 그 설계도를 바탕으로 새로운 객체를 만들어 내야(new 객체()) 한다고 이해하면 된다.

 

객체 안에서 자신의 참조값(id)를 가리키며 참조할 때 this. 을 사용하고, 혼돈의 소지만 없다면 this.를 생략해도 된다.

 

Static과 non-static의 차이점 아마 퀴즈에 나오려나보다

 

public class{

     public static String name;

     public static void doSth(){

     }

}

 

Static 필드에 있는 녀석은 참조할 때 클래스이름. 을 생략 가능하다.

System.out.println

 

 

 

<10:30 2교시>

package test.main;

import java.io.PrintStream;

public class MainClass08 {
	//static 필드 -> 참조가 된다.
	public static String myName="나의 이름은";
	//non static field -> 참조가 안 된다
	public String yourName "너의 이름은";
	
	public static void main(String[] args) {
		//System 클래스의 out이라는 static 필드에는 콘솔창에 출력하는 기능을 가지고 있는 PrintStream type
		//의 참조값이 들어 있다.
		
		PrintStream a= System.out;
		a.println("오잉?");

		System.out.println(MainClass08.myName);
		System.out.println(myName);
	
		
		//이 아래에 두 줄은 참조도 안되고 그 중 아래 줄은 말도 안되는 경우다.
		//System.out.println(MaiClass08.yourName);
		//Static 필드 값이 아니기 때문에 클래스명.참조가 안된다.
		
		//System.out.println(this.yourName);
		//this. 은 static 영역이 아니고 heap 영역에서만 쓸 수 있음
		//Static 메소드 안에서는 스태틱 자원 밖에 못 쓴다.(this.을 사용할 수 없음)
	}
}

기본 데이터 타입(숫자, 문자, 불리언 8개) 이외의 나머지 타입은 모두 참조값을 갖는 데이터 타입이다.

 

 

 

생성자를 만드는 방법

더보기
package test.mypac;

public class Member {
	//멤버가 여러명이기 때문에 Static 필드로 만들지 않는다)
	public int num;
	public String name;
	public String addr;

	//이 아래가 기본 생성자를 선언해준 부분
	//기본 생성자는 아래와 같이 별도로 명시해준 새로운 생성자가 없으면
	//디폴트 값으로 있다고 생각하면 되는 거라 기본 생성자이다.
	public Member() {}
	//아래는 메소드가 아니다 return type(void, int 등)이 없어서
	//아래 애들은 생성자라고 부른다.
	//아래 생성자가 생기면 기본 생성자 Member()가 사라지기 때문에 
	//위에서 기본 생성자도 명시해 줘야 함
	public Member(int num, String name, String addr) {
		//매개 변수에 전달된 값을 필드에 저장하기
		this.num=num;
		this.name=name;
		this.addr=addr;		
	}
}

 

생성자를 활용한 코드

더보기
package test.main;

import test.mypac.Member;

public class MainClass09 {
	public static void main(String[] args) {
		/*
		 * Member 객체를 3개 생성해서 각각의 객체에 3명의 정보를 담으세요
		 */
		
		Member mem1 = new Member();
		Member mem2 = new Member();
		mem1.num = 1;
		mem1.name ="하나";
		mem1.addr ="주소1";
		
		mem2.num=2;
		mem2.name="두울";
		mem2.addr="주소2";
		
		//매개변수에 값을 3개 전달받는 생성자를 이용해서 객체 생성
		Member mem3 = new Member(3, "세엣", "주소3");
		/* 
		
		Member mem3 = new Member();
	
		mem3.num=3;
		mem3.name="세엣";
		mem3.addr="주소3";
		
		 */
		
	}
}

 

<11:30 3교시>

Member클래스에 메소드 만들어보기

더보기
package test.mypac;

public class Member {
	//멤버가 여러명이기 때문에 Static 필드로 만들지 않는다)
	public int num;
	public String name;
	public String addr;

	public Member() {}
	public Member(int num, String name, String addr) {
		//매개 변수에 전달된 값을 필드에 저장하기
		this.num=num;
		this.name=name;
		this.addr=addr;		
	}
	
	//필드에 저장된 정보를 콘솔창에 출력하는 메소드
	public void showInfo() {
		System.out.println("회원 번호 "+this.num+"의 회원의 이름은 "+this.name+"이고, 주소는 "+addr+"이다.");
	}
	// 매개변수에 전달된 번호를 필드에 저장하고 자신의 참조값을 리턴하는 메소드
	public Member num(int num) {
		this.num=num;
		return this;
		
		//return this; 라고 하려면 void 대신에 Member를 입력해야함 
		//왜냐하면 this가 멤버 타입이기 때문에
	}
	//매개변수에 전달된 이름을 필드에 저장하고 자신의 참조값을 리턴하는 메소드
	public Member name(String name) {
		this.name=name;
		return this;		
	} 
	//매개변수에 전달된 주소를 필드에 저장하고 자신의 참조값을 리턴하는 메소드
	public Member addr(String addr) {
		this.addr=addr;
		return this;
	}
	
	
}

 

상품 클래스 만들고 공개된 필드와 보호된 필드의 차이 확인하기

더보기
package test.mypac;

//상품 하나의 정보를 담을 객체를 생성할 클래스 정의하기
public class Product {
	public int id;
	public String name;
	public int price;
	//java에서는 공개된 필드를 잘 사용하지 않는다.
	//필드를 공개하면 필드를 직접 참조해서 값을 변경시킬 수 있기 때문에 그렇다
	//마치 리모콘의 회로를 숨겨둔 것과 같은 이유다
	
	//디폴트 생성자
	public Product() {}
	//필드에 저장할 값을 모두 전달 받는 생성자
	public Product(int id, String name, int price) {
		this.id =id;
		this.name = name;
		this.price = price;
	}
}

id, name, price를 모두 private으로 바꿀 때 접근 메소드를 제공해줄 필요가 있다.

 

접근 메소드 만들기

Set Ctrl Space하면 자동으로 생성됨

Setter 메소드가 있으면 Getter 메소드가 있어야 가져오는 기능까지 가능해진다.

Setter, Getter로 참조하기

 

Setter, Getter로 참조하기

더보기
package test.mypac;

//상품 하나의 정보를 담을 객체를 생성할 클래스 정의하기
public class Product {
	private int id;
	private String name;
	private int price;
	//java에서는 공개된 필드를 잘 사용하지 않는다.
	//필드를 공개하면 필드를 직접 참조해서 값을 변경시킬 수 있기 때문에 그렇다
	//마치 리모콘의 회로를 숨겨둔 것과 같은 이유다
	
	//디폴트 생성자
	public Product() {}
	//필드에 저장할 값을 모두 전달 받는 생성자
	public Product(int id, String name, int price) {
		this.id =id;
		this.name = name;
		this.price = price;
	}
	//setter메소드 : 접근메소드
	public void setId(int id) {
		this.id = id;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	//getter 메소드 : 접근메소드
	public int getId() {
		return id;
	}
	public String getName() {
		return name;
	}
	public int getPrice() {
		return price;
	}
}

더보기
package test.main;

import test.mypac.Product;

public class MainClass11 {
	public static void main(String[] args) {
		
		Product p2=new Product(2, "아이폰", 100);
		
		Product p1=new Product();
		p1.setId(1);
		p1.setName("에어팟");
		p1.setPrice(20);
		
		String info = "아이디:"+p1.getId()+"이름:"+p1.getName()+"가격: "+p1.getPrice();
		String info2 = "아이디:"+p2.getId()+"이름:"+p2.getName()+"가격: "+p2.getPrice();
	
		System.out.println(info);
		System.out.println(info2);
	
	}
}

오전 진도 끝.

4교시 실습시간에는 그동안 했던 프로젝트3의 내용 다시 살펴보기

+ Recent posts