이틀동안 휴강~~ 다시 힘내보자

저번시간 복습~ 라이브러리api(재사용 가능)와 실행용 따로
메모리(저장 공간)는 heap(여러 객체만 생성-company,power,각종 메소드들)과 stack(메인. 출력문들,각종클래스,메소드들값을 읽어옴), class(각종 클래스들 1번만 들어옴)로 이루어짐


선언 위치에 따른 변수 지정

  • 변수의 종류


  1. 전역변수: 생성과 동시 0으로 기본값이 초기화가 되어있음. class 바로 아래 선언.

1) 인스턴스(객체) 변수: 객체가 생성되면 내 객체는 나만 쓰는 값의 개별적인 메모리가 형성됨.
그래서 인스턴스마다 다른 값 저장 가능.
그래서 객체 생성 해야됨!!

2) 클래스 변수(static변수): 공유 변수(같은 클래스에서 객체 생성하면 그 객체들이 같은 변수 값을 공유할 수 있음)

★객체를 생성하지 않아도 출력할 수 있음.("클래스이름.변수이름"만으로도 출력)

System.out.println(StaticVar01.staNum1);

  1. 지역변수: 클래스 이외의 곳에서 만들어지는 모든 변수!
    -기본값이 없어 초기화하는 과정이 없음.
    -메서드(함수) 안에 선언. if문, while문,switch문 등
    -실행이 끝나면 저장공간 사라짐.

*this 키워드:
현재 속해있는 객체(=인스턴스 변수)를 가리키는 키워드.

String subjectName(String subName) {
		this.subName = subName;
		return this.subName;
	}

static void totalCount(int tCount) {
		//this.tCount = tCount; 	this는 객체를 가리키는데, 클래스 메서드는 객체가 없으므로 오류남.
		System.out.println("현재 수강인원: " + tCount);
	}

  • 메서드의 종류

1) 인스턴스 메서드:
인스턴스(객체) 생성 후, '참조변수.메서드명()'으로 호출

2) 클래스 메서드(static 메서드):
객체 생성없이 'static 클래스이름.메서드명()'으로 호출



메서드 오버로딩(Method overloading)

하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것.


  1. 조건
  • 메서드의 이름이 같아야 한다.

  • 매개변수의 개수 또는 타입이 달라야 한다.

  • 매개변수의 이름이 다른 것은 오버로딩 아님!

    	int add(int a, int b)
    	int add(int x, int y)

  1. 예시
  • System.out.println() 메서드:
    다양하게 오버로딩된 메서드를 제공함으로써 모든 변수를 출력할 수 있도록 설계.

    void println()
    void println(int x)
    void println(String x)
    void println(double x)
    .
    .
    .

*연습문제*
//사칙연산의 결과를 메서드 오버로딩을 이용하여 자유롭게 나타내시오
//배열을 이용하여 배열의 길이만큼의 합을 위의 문제에서 생성했던 오버로딩에 이어 작성하시오.



가변인자 오버로딩(varargs overloading)

:메서드의 매개변수를 동적으로 지정 가능(JDK 1.5버전부터... 거의 다 이 버전 넘겨서 거의 다 된다고 보면 됨ㅎ)
뭔 말이냐면 매개변수의 개수가 몇 개가 될지 모를 때 사용함!

가변인자는 반드시 마지막 매개변수여야함.

printStream printf(String format, Object... args) (...)

* 배열일 때 향상된 for문 사용:
배열 처음부터 끝까지 모두 돌면서 실행

for(자료형 변수이름 : 배열이름)




생성자(constructor):

-인스턴스(객체)가 생성될 때마다 반드시 1번 호출되는 인스턴스 초기화 메서드.
*인스턴스 초기화: 인스턴스 변수에 적절한 값을 저장하는 것
-인스턴스 생성시, 수행할 작업에도 사용
-모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.


  1. 조건
    -생성자 이름은 클래스의 이름과 같아야 한다.
    -생성자는 리턴값이 없다.

  1. 기본(default) 생성자:
    클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가한다.
    생성자가 하나라도 있으면 추가 안 함.
public class Car {

	String color;
	String model;
	int door;
	
	/*
	 * Car() { } : 빈 생성자, 자동생성되어 컴파일됨
	 */
	Car(String color, String model, int door) {
		System.out.println("Car 생성자 호출");
		this.color = color;
		this.model = model;
		this.door = door;
	}
}


	public static void main(String[] args) {

		Car car1 = new Car("black", "제네시스", 5);
		System.out.println("car1 색상: " + car1.color);
		System.out.println("car1 모델: " + car1.model);
		System.out.println("car1 문 개수: " + car1.door);
		System.out.println("----------------------");
		
		//객체 생성시 바로 초기화되기 때문에 다른 값이 출력됨
		Car car2 = new Car("white", "스포츠카", 3);
		System.out.println("car2 색상: " + car2.color);
		System.out.println("car2 모델: " + car2.model);
		System.out.println("car2 문 개수: " + car2.door);
	}

*연습문제*
//변수: 학번, 이름, 전화번호 / 생성자(매개변수 3개)의 인스턴스 변수를 초기화, 학생 3명


  1. 생성자 오버로딩 가능:
    매개변수를 다르게 여러개의 생성자 선언 가능
    생성자 안에서 다른 생성자를 호출할 수 있음.
public class Car {

	String color = "black";
	String model = "SM7";
	int door = 5;
	
	Car(String color) {
		this.color = color;
	}
	Car(int door) {
		this.door = door;
	}
	Car(String color, String model) {
		this.color = color;
		this.model = model;
	}
	Car(String color, int door) {
		this.color = color;
		this.door = door;
	}
	Car(String color, String model, int door) {
		this.color = color;
		this.model = model;
		this.door = door;
	}
    Car(){
		
	}
}


public static void main(String[] args) {

Car car1 = new Car(3);
		Car car2 = new Car("yellow");
		
		Car car3 = new Car("Green", "K7");
		Car car4 = new Car();	//빈 생성자가 있어야 오류 안 남!
}


  1. 다른 생성자 호출 가능
    this가 매개변수 개수가 맞는 애를 찾아서 갔다가 거기서 할일 끝내고 다시 본인으로 돌아와서 할일 끝냄.
public class Car {

	String color;
	String model;
	int door;
	
	Car() {
		this("black", "SM7", 5);
        System.out.println("매개변수가 없는 생성자");	//this가 출력문보다 선행되어야함.
	}
	Car(String color) {
		this(color, "SM7", 5);
	}
	Car(int door) {
		this("black", "SM7", door);
	}
	Car(String color, String model) {
		this(color, model, 5);
	}
	Car(String color, int door) {
		this(color, "SM7", door);
	}
	Car(String color, String model, int door) {
		this.color = color;
		this.model = model;
		this.door = door;
        System.out.println("매개변수가 3개인 생성자");
	}
    여기선 맨 마지막 애를 찾아감.
    
    
    public static void main(String[] args) {
    
    Car car4 = new Car();
    }
    => 매개변수가 3개인 생성자
       매개변수가 없는 생성자

그래서 "매개변수가 3개인 생성자"가 먼저 출력된 것임.
반드시 첫 줄에 this( )로 호출한다



변수의 초기화:

변수를 선언하고 처음으로 값을 저장하는 것.
멤버변수(인스턴스 변수, 클래스 변수)와 배열은 각 타입의 기본값(0)으로 자동 초기화돼서 생략 가능
지역변수는 꼭!!!!!!!!!!!! 초기화를 해줘야한다.


  1. 멤버변수(인스턴스 변수)의 초기화
  • 명시적 초기화:
    변수를 지정하면서 값을 넣는 것.

    int a = 3;
  • 생성자 초기화:


  • 초기화 블럭:
    아무것도 안 쓰고 중괄호만 두는 것.

1) 인스턴스 초기화 블럭:
인스턴스(객체)가 생성될 때마다 (생성자보다 먼저) 실행됨.

{ }

2) 클래스 초기화 블럭:
클래스가 로딩될 때 1번 실행됨.

static { }


  1. 멤버변수의 초기화 순서
    덮어쓰기 하기 때문에 생성자의 값이 젤 마지막에 남음
    외울 필요X, 거의 생성자 하나 정도만 씀

    기본값 -> 명시적 초기화값 -> 초기화블럭 -> 생성자 
profile
내 인생을 망치러 온 나의 구원, 개발

0개의 댓글