Jam's story

16일차 본문

Java

16일차

애플쩀 2022. 3. 11. 12:42
클래스 배열 선언 

s는 배열명이다.  배열명[인덱스] 마다 new 연산자를 이용해서 객체를 생성해준다. 

Student[] s= new Student[3];은 배열을 생성한것이지 , 객체를 생성한 것이 아님 

		Student[] s =new Student[3];	
		s[0]=new Student();
		s[1]=new Student();
		s[2]=new Student();
		
        
        
		Student [] s= {
				new Student(),
				new Student(),
				new Student()
				
		};
        
        
        
        	Student[] s=new Student[3];
		for(int i=0; i<3; i++) {
			s[i]=new Student();
		}

 

 

private 필드에 접근하는 방법 -> getter , setter 
getter setter  사용이유 

필드를 public 으로 설정했다면 getter setter가 필요가 없다 .

1. 쓰기/읽기 전용의 멤버를 만들고 싶을때 

2.유효한 값을 멤버(필드)에 할당하고자 할때 

 

단축키는 Alt+Shift+S 

 

생성자 
  • 생성자 정의 : 메소드 
  • 생성자의 역할: 인스턴스 초기화 = 인스턴스 필드 초기화
  • 생성자 호출 시기 : 인스턴스 생성될 때 호출한다. 
  • 생성자는 강제로 호출되는 것이 아니다. 자동으로 호출된다 .
  • 리턴값이 없다. 
  • 생성자의 이름은 클래스 이름과 같아야한다. 
  • 접근지정자 4가지 사용 가능 
  • 매개변수가 없는 생성자를 디폴트 생성자라고 한다.  클래스명(){ } 
  • 생성자는 상속되지 않는다. 
  • 클래스명(매개변수 ){ 내용 }

 

기본생성자 Default 생성자 
  • 매개변수가 없는 생성자 
  • 컴파일러가 자동적으로 생성해준다. 
  • 매개변수가 있는 생성자가 있을 시, 자동적으로 추가되지 않기 때문에 
  • 매개변수가 있는 생성자가 있다면 기본생성자를 생성해줘야 한다. 

 

생성자를 이용한 인스턴스의 복사 

인스턴스 변수 상태가 동일한 값의 생성자를 하나 더 만들때, 

인스턴스의 복사를 위한 생성자를 만들어준다. 

서로 독립적으로 메모리공간에 존재하기 때문에

원래 객체의 값을 바꿔도 복제된 객체의 값이 변하지않는다. 

 

public class Car {
	String color;
	String gearType;
	int door;

	public Car() {
		this("blue", "s", 12);
	}
	public Car(Car c) {
		this.color=c.color;
		this.gearType=c.gearType;
		this.door=door;
	}
	public Car(String color, String gearType, int door) {
		super();
		this.color = color;
		this.gearType = gearType;
		this.door = door;
	}
	

}
class carTest{
	public static void main(String[] args) {
		Car c1=new Car();
		Car c2=new Car(c1);
		System.out.println(c1.color+ c1.gearType+ c1.door);
		System.out.println(c2.color+ c2.gearType+ c2.door);
		c2.door=342;
		System.out.println(c1.color+ c1.gearType+ c1.door);
		System.out.println(c2.color+ c2.gearType+ c2.door);
	}
}
this

생성자를 호출할 수 있고 멤버를 가리킬 수도 있다. 

단독으로 사용될때의 this-> 리턴값, 매개변수

 

오버로딩- 메소드명 동일,  매개변수 갯수, 타입 달라야한다. 
리턴자료형만 다르다고 오버로딩 되지는 않는다. 

1
2

  

1)이것은 p2.dispPoint ()와 같다. 

2)p1.dispPoint()와 같다. this는 메소드를 호출한 객체 , p2는 매개변수일 뿐이다. 

 

 

 

static 
  1. 제어자 modifier
  2. 사용할 수 있는 곳 
    1. 클래스 
    2. 변수
    3. 메소드
  3.  사용할 수 있는 곳 : 멤버변수(필드) , 메소드 , 초기화 블록

static은 왜 클래스이름을 통해서 사용하는지? 

- 객체를 생성하기 전에도 이미 클래스당 하나만 생성해서 모든 객체에서 공유하기 때문에 

 

static 메소드를 왜 사용하는지? 

  • 객체를 생성하기 전에 static 클래스 변수는 메모리 할당되고 클래스명.클래스변수를 사용할 수 있어요
    • private 선언되면 접근할 수 없기때문에 static+(public) getter, setter 이용  
  • 자주 사용하는 메소드는 static 이용, 객체를 생성하지않고 바로 클래스명으로 접근할 수 있기 때문에

 

변수의 초기화 = 변수를 선언하고 처음으로 값을 저장하는 것 

1. 지역변수 = 초기화를 하지 않으면 에러난다.  초기화필수적 

2. 인스턴수변수, 클래스변수 = 초기화안해도 각 자료형의 기본값으로 초기화 

3.  p300 각 타입의 기본값 표 

boolean  -> false

int, short, byte ->0

float, double -> 0.0f , 0.0

char -> '\u0000' 

참조타입 -> null 

 

필드, 초기화방법 

  • 명시적초기화
  • 생성자초기화
  • 초기화블럭
초기화 순서 

명시적초기화 ->클래스초기화블럭 static{} -> 초기화 블록 ->생성자초기화

static초기화는 객체 생성수에 관계없이 프로그램실행시 1번만 실행된다 .

 

명시적초기화
클래스의 필드 선언시 값을 할당하는 것을 "명시적 초기화"라고 한다. 

String name="미상"; //String은 참조형=>null 로 초기화 된다.
int age=20;
static double rate=0.02;

int count; //명시적초기화X 초기화가 안되어있다. 기본값으로 초기화 되어있음 

 

생성자초기화 
	public Person() {}
	public Person(String name, int age, double rate ) {
		this.name = name;
		this.age = age;
		this.rate=rate;
	}

 

초기화블록

공통적인 부분이 있을 때 ,

{} 안에 초기화를 한다. 

위에는 인스턴스초기화 

밑에는 static초기화  -> 객체가 몇개가 생성되던지 상관없이 프로그램 시작할때 실행한다 .

	{
		count++;
		serialNo=count;
	}
	static {
		rate=0.07;
	}

 

 

초기화 순서 알아보는 예제 

명시적초기화 ->클래스초기화블럭 static{} -> 초기화 블록 ->생성자초기화

 

 

 

오늘 강사님께 질문한것 

여기서 count{} 를 static 클래스초기화로  설정하면 

static은 객체생성시마다  실행되지 않고, 프로그램 실행할때 딱1번 실행하기때문에 

누적된 값을 구할 수 없다. 그래서 인스턴스 초기화인 {count++;} 로 바꾸어야 한다 (객체 생성시 마다 실행).

 

이 상황에서 count가 똑같이 나오는 이유는 ?

static을 붙여야한다. 

그래야 누적된 값이 나온다 .

public class Ex10 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person p1=new Person("김기태",26,0.05);
		System.out.println(p1.name);
		System.out.println(p1.age);
		System.out.println(p1.rate);
		System.out.println("고유번호: "+p1.serialNo);
		
		Person p2=new Person();
		System.out.println("고유번호: "+p2.serialNo);
	}

}
class Person{
	//필드(인스턴스 변수, 클래스 변수 )
	//필드를 초기화 하지않으면 각 타입의 기본값으로 초기화 된다 .
	//명시적 초기화 
	String name="미상"; //String은 참조형=>null 로 초기화 된다.  
	int age=20; 	
	static double rate=0.02; 
	int count;
	int serialNo;
	//메소드 
	
	//생성자 
	public Person() {
		count++;
		serialNo=count;
	}
	public Person(String name, int age, double rate ) {
		count++;
		serialNo=count;
		this.name = name;
		this.age = age;
		this.rate=rate;
	}
	
	
}

 

'Java' 카테고리의 다른 글

18일차  (0) 2022.03.15
17일차  (0) 2022.03.14
15일차  (0) 2022.03.10
14일차  (0) 2022.03.08
12일차  (0) 2022.03.04
Comments