728x90

 

ch6-38 변수의 초기화

<변수의 초기화>

지역변수(lv)는 수동 초기화 해야함

멤버변수(iv,cv)는 자동초기화된다

 

지역변수(lv)는 수동 초기화 해야함

class InitTest {
    int x;        // 인스턴수변수(iv)
		int y = x;    // 인스턴스변수(iv)
   
    void method1() {
         int i;      // 지역변수
         int j = i;  // error : 지역변수를 초기화하지 않고 사용해서
    }
}

i의 모르는 값을 j의 모르는 값에 넣을려고 하니 에러난 것

 

수동초기화 해야하는 이유

호출 스택 메모리

계속 쌓였다가 없어졌다 한다(재사용이 빈번한 메모리)

계속 같은 공간을 여기저기서 사용한다

메소드가 호출될 때마다 이 공간을 0으로 초기화하면 성능저하됨

이를 방지하기 위해서 항상 0으로 초기화하는게 아닌 새로운 값으로 초기화한다

지역변수는 메소드가 호출되서 작업하는 동안만 존재하기에 생명 주기가 굉장히 짧다(메소드는 빨리 실행되고 제거되는게 좋다)

옛날 다른 메소드가 쓰던 값을 새로운 값으로 초기화하는데 다른 메소드가 쓰던 값을 뭔지 모르는데 그 값을 덮어쓰는거고 그래서 수동 초기화 해야만함

인스턴스 변수는 유지기간이 비교적 길어서 초기화하고 쓴다(자동초기화)

인스턴스 변수(자동초기화)

 

 

멤버변수(iv,cv)는 자동초기화된다

class InitTest {
    int x;        // 인스턴수변수(iv)
		int y = x;    // 인스턴스변수(iv)

InitTest it = new InitTest();

 

 

데이터타입 별 초기화 값

 

 


 

 

 

 

ch6-39 멤버변수의 초기화

<멤버변수의 초기화>

1.명시적 초기화(=)

2.초기화 블럭 { }

3.생성자

 

 

1.명시적 초기화(=)

대입연산자(=) 이용

간단한 초기화 방법

 

1)기본형(primitive type) 변수의 초기화

int door = 4;

 

2)참조형(reference type) 변수의 초기화

Engine e = new Engine();

참조형 변수가 가질 수 있는 값

  • null or 객체주소
  • 기본값은 nul

참조형은 객체를 만들어넣어줘야한다

객체를 만들어 값을 넣어주면서 초기화해야함

 

2.초기화 블럭

복잡한 초기화

여러문장 넣기

(여러문장이 필요하면 대입연산자로는 불가능)

  • 인스턴스 초기화 블럭 : { }
  • 클래스 초기화 블럭 : static { }

 

3.생성자

iv초기화

복잡한 초기화에 사용

 

 

멤버변수 cv, iv 초기화의 3가지 방법

1.자동초기화 : 자동

2.간단초기화 : 대입연산자 =

3.복잡초기화 : { }, static { } , 생성자

  • cv 초기화에는 static { }
  • iv 초기화에는 생성자. // {}도 쓰긴하나 거의안씀

 

위의 이미지는 명시적 초기화로 간단하게 배열 생성 및 초기화하고 초기화블럭 static {}을 사용해서 cv 복잡초기화로 배열 안에 값을 for문 이용하여 채운 것

 

 

 

멤버변수 초기화 시점

1.클래스 변수 초기화 시점

클래스가 처음 로딩될 때 한번(메모리에 올라갈 때)

2.인스턴스 변수 초기화 시점

인스턴스가 생성될 때 마다

 

 

멤버변수 초기화 순서

 

 

 

 

728x90
반응형
728x90

 

객체 배열 == 참조변수 배열

 

객체의 배열이란?

참조변수 여러개를 묶어서 배열을 만든 것

Tv tv1, tv2, tv3;  // Tv데이터 타입인 변수tv1,tv2,tv3 

    ↓↓↓  배열로 전환하면

Tv[] tvArr = new Tv[3]; // 

참조변수 3개를 배열로 만든 것

그래서 객체의 배열이라 부름

만들어진 각 객체의 주소값이 링크되고 초기화 된 것

 

 

객체의 배열 초기화

// 객체를 생성해서 배열의 각 요소에 저장
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();

    ↓↓↓  간단히 초기화

Tv[] tvArr = { new Tv(), new Tv(), new Tv() };
Tv[] tvArr = new Tv[3];
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();

위의 코드의 세부과정

1)참조변수 tvArr 생성됨

2)tvArr 참조변수 3개가 배열로 생성되고 주소값 생성

(new)연산자가 heap영역에 배열 및 주소값 생성

 

3)tvArr[0] = new Tv(); 이 문장이 실행되서 tvArr[0] 문장이 실행되서 new Tv();가 tvArr[0]로 대입됨

만들어진 객체의 주소값 0x100이 tvArr[0]로 링크 되고 마찬가지로 tvArr[1],tvArr[2]도 주소값 링크됨

 

 

주의사항

Tv[] tvArr = new Tv[3];

이 코드만 만들어두면 참조변수 배열만 생성해둔 거기에 참조변수만 만들어둔 것이고 객체를 하나씩 넣어줘야하는데 안하고 객체를 호출하게 되면 객체생성이 안됬다고 에러남

 

 

728x90
반응형
728x90

생성자 this()

생성자에서 다른 생성자 호출할 때 사용

코드 중복을 제거할려고 this() 사용

 

원래 코드는 Car(color, “auto”, 4)로 호출해야함

this()생성자를  사용하므로써 이렇게 this(color, “auto”, 4) 

 

 

코드의 중복

Car() { // Car()의미는 () 안에 매개변수를 아무 값도 지정하지 않았으면 
        // 디폴트 값으로 아래의 세가지를 넣으라는 것
	color = "white";
	gearType = "auto";
	door = 4;
}

 

이미지 왼쪽의 중복된 코드(변경 전)

class Car{
	String color;
	String gearType;
	int door;
//////////////////////////////////////////////////////////
			Car() {                         // 1번 Car()
				color = "white";
				gearType = "auto";
				door = 4;
			}
			
			Car(String c, String g, int d){ // 2번 Car()
				color = c;
				gearType = g;
				door = d;
			}
}        // 1번 Car()와 2번 Car()가 같은 코드로 중복(bad)

 

이미지 오른쪽에 코드의 중복을 제거한 코드(변경 후)

class Car{
	String color;
	String gearType;
	int door;
//////////////////////////////////////////////////////////
		Car() {
			// Car("white","auto",4);
			this("white","auto",4);   // 바로 Car생성자의 매개변수로 값 대입
		}  // 중복 제거(good)
		
		Car(String c, String g, int d){
			color = c;
			gearType = g;
			door = d;
		}
}

 


 

참조변수 this.

인스턴스 자신을 가리키는 참조변수(reference variable)

 

특징

인스턴스 메서드(생성자 포함)에서만 사용 가능

    - 클래스 메소드(static 메소드)에서 사용 불가

지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용

인스턴스의 주소가 저장되어있다

모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다(생략 가능)         

    - 전역변수와 지역변수 구분을 위해 쓰는 경우는 생략하면 에러는 아니나 지역변수 = 지역변수;가 되버려서 의미x

    - this를 선언안해도 사용가능. 선언한 적 없는데 사용할 수 있는 변수

 

ex)

long a ,b;

참조변수 long a ,b의 진짜 이름은 this.a, this.b

long add() {
	return a + b; // return this.a + this.b;

 

 

728x90
반응형
728x90

 

생성자(constructor)

인스턴스가 생성될 때마다 호출되는 ‘인스턴스 초기화 메서드’하는 역할

이외에도 메서드이기 때문에 {}에 작업할 내용을 넣으면 됨

모든 클래스에는 반드시 하나의 생성자가 있어야한다

 

ex) iv 초기화 예시

Time t = new Time();  // 생성자
t.hour = 12;    // 인스턴스 메소드(iv) 초기화
t.minute = 34;  // 인스턴스 메소드(iv) 초기화
t.second = 56;  // 인스턴스 메소드(iv) 초기화

 

 

생성자의 필요성

위처럼 객체생성 후 iv 초기화를 해야하므로 번거롭다

한 줄로 할 수 있다면 직관적이고 편리할 것

 

생성자 예시

	Time t = new Time(12,34,56); // 생성자

위의 4줄이 1줄로

 

생성자 호출이라는 의미

생성자 불러다 썼다는 의미

 

 

생성자의 규칙

1) 클래스명과 생성자명이 같아야한다

2)항상 리턴값이 없다(void 안붙인다)

 

 

 

1) 클래스명과 생성자명이 같아야한다

    같은 이름이 존재할 수 있는건 오버로딩이 가능하기 때문

2)항상 리턴값이 없다(void 안붙인다)

 

 

 

1.기본 생성자(default constructor)

생성자가 하나도 없을 때만 컴파일러가 자동 추가

생성자는 원래는 직접 값을 넣어줘야한다

기본생성자를 안넣어주면 에러메세지가 다른게 나오기에 찾기 힘들다

Card c = new Card(); // 기본생성자

 

 

기본생성자 에러

class Data_1도 생성자가 없지만 에러가 안나는건 값을 안넣어줬기 때문이고, Class Data_2에는 Data_2(int x)라는 값을 임의로 넣어줬기 때문에 생성자도 따로 지정해줬어야 했는데 안했기에 에러가 난 것

 

2.매개변수가 있는 생성자

 

매개변수 생성자가 필요한 이유

4줄이 1줄로

 

Car c = new Car(”while”,”auto”,4); 문장이 실행되는 과정

 

1)참조변수 C가 생성됨

2)new연산자가 객체 및 주소값 생성

3)생성자 호출되면서 객체 초기화

4)변수(Car c)에 주소값이 들어감

 

 

1)참조변수 C가 생성됨

2)new연산자가 객체를 만들고 객체에 주소값 부여

       (객체 멤버 3개 : color, geartype, door)

각 객체 멤버에 데이터타입의 기본값 들어가 있음(String은 null int는 0)

 

3)생성자가 호출되면서 객체를 초기화시킴

생성자 호출로 white, auto, 4의 값이 color, geartype, door로 들어감

 

초기화란?

자기가 원하는 값을 처음으로 넣는 것을 초기화라 부름

 

4)마지막으로 Car c에 주소값이 들어감

객체와 참조변수 연결해야하니까 대입연산자( = )가 객체의 주소를 저장한다

객체의 주소값은 new연산자의 반환값

 

728x90
반응형
728x90

 

평균 계산시, int / int = int가 나오므로 (float or double) 형변환 해줄 것

average = sum / (float)score.length; // 계산 결과를 float타입으로 형변환

 

총점과 평균

package practice03_jungsuk;

public class Ch5_89_array활용 {
	public static void main(String[] args) {
		
		int sum = 0;
		float average = 0f;
		
		int[] score = {100, 88 , 100, 100, 90};
		
		for(int i = 0; i < score.length; i++) {
			sum += score[i];
		}
		average = sum / (float)score.length; // 평균 연산시, 실수 형변환 잊지말것
		// casting안하면 정수로 결과도출 및 데이터 손실. (float)변환시 95.6 int시 95
		
		System.out.println("총점 : " +sum);
		System.out.println("평균 : " +average);
	}	
}

 

 

최대값 최소값

int[] score2 = {79,88,91,33,100,55,95}; 
		
int max = score2[0]; // 배열의 첫번째 값으로 최대값 초기화
int min = score2[0]; // 배열의 첫번째 값으로 최소값 초기화

for(int i=1; i<score2.length; i++) {
	if(score2[i] > max) {
		max = score2[i];
	}else if(score2[i] < min) {
		min = score2[i];
	}
} 

System.out.println("최대값 : " + max);
System.out.println("최소값 : " + min);

 

728x90
반응형
728x90

 

ch5-4 배열의 길이

배열의 길이

배열이름.length - 배열의 길이(int형 상수)

int[] arr = new int[5];  // 길이가 5인 int배열
int tmp = arr.length;    // arr.lenght의 값은 5이고 tmp에 5가 저장된다

 

배열은 한번 생성하면 그 길이를 바꿀 수 없다

why?

int[5]가 4byte인 int가 5개이므로 4x5 =20 byte

여기서 int[5]를 10칸인 int[10]으로 바꾸고 싶다면 4x10=40이므로 두배의 공간이 필요하게 되고 배열은 연속해서 저장공간을 만든다. 새로 만들려면 연속된 공간 저장 확보가 어렵다면 떨어진 곳에 만들어야하는데 자바는 크기를 못 늘리게하고 필요하면 다른 곳으로 옮기게 규칙을 정해놓음

 

 

길이가 부족할 때는?

길이를 늘릴 수 없기에 새로운 걸 큰 걸 만들고 기존의 내용새 배열에 복사

for (int i=0; i < score.length;i++) // 조건식 변경 불필요
		System.out.println(score[i];

 

 


 

ch5-5 배열의 초기화

배열의 초기화

배열의 각 요소에 처음으로 값저장하는 것

int[[ score = new int[5]; // 길이가 5인 int형 배열 생성
score[0] = 50; // ← 배열 초기화
score[1] = 60; // ← 배열 초기화
score[2] = 70; // ← 배열 초기화
score[3] = 80; // ← 배열 초기화
score[4] = 90; // ← 배열 초기화

배열은 기본적으로 인트형으로 자동 초기화

 

반복문으로 초기화 가능

for(int i=0; i<score.length; i++)
	score[i] = i * 10 + 50;

// 결과값으로 
score[0] = 50;
score[1] = 60; 
score[2] = 70; 
score[3] = 80; 
score[4] = 90; 

 

 

간단 초기화 방법

  1. int[] score = new int[] {50, 60 , 70, 80, 90};
  2. int[] score = {50, 60 , 70, 80, 90}; // new int[] 생략가능

대부분 2번으로 많이 사용

 

주의사항

// 아래의 코드는 2)과 같은 코드이나 따로쓰면 error
int[] score;
score = {50, 60 , 70, 80, 90}; // error : new int[] 생략 불가
score = new int[]{50, 60 , 70, 80, 90}; // 가능

 

728x90
반응형
728x90

 

오버플로우(Overflow) 의미

표현 할 수 있는 범위를 넘어섰다

 

2진수 이해가 어려울 때는 10진수와 비교해보면 이해가 쉬워진다

 

 

10진수와 2진수의 이해

 

 

 

10진수

1이 아닌 0부터 시작해서 -1을 하는 것

 

 

2진수

 

규칙

 

 

 

 

728x90
반응형
728x90

 

Scanner란?

화면으로부터 데이터를 입력받는 기능을 제공하는 ‘클래스’

 

1)import문 추가

    - import java.util.*;

 

 

2)Scanner객체의 생성

    - Scanner scanner = new Scanner(System.in)

    - System.in : 화면입력한다는 의미

 

 

3)Scanner객체를 사용

int num = scanner.nextInt();       // 화면에서 입력받은 정수를 num에 저장
String input scanner.nextLine();   // 화면에서 입력받은 내용을 input에 저장.
                                   // nextLine은 한 행을 읽어서 문자로 변환
int num = Integer.parseInt(input); // 문자열(input)을 숫자(num)로 변환

   

     

<실습>

import java.util.*;

public class Ch2_14_Scanner {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		int num2 = sc.nextInt();
		int num3 = sc.nextInt();
		System.out.println(num);
		System.out.println(num2);
		System.out.println(num3); // 가로로 공백한칸 띄우고 입력가능
// 입력값 100 200 300
// 결과값
// 100
// 200
// 300

Integer.parseInt()

nextLine() : 라인 단위로 값 입력받기 가능

 

728x90
반응형
728x90

 

 

1.형식화된 출력 - printf()

println() 메소드의 단점 : 출력형식 지정불가

1)실수의 자리수 조절불가 - 소수점 n자리만 출력하려면?

       Systme.out.println(10.0/3);    // 3.33333333…

 

정수 나누기 정수는 값이 소수점이 나와야하지만 정수로 출력함

하나를 실수로 바꿔야 소수점까지 제대로 출력됨

3.33333333...값을 제대로 얻으려면 10/3 아닌 10.0/3 해야한다는 것만 일단 기억해두자

 

2)10진수로만 출력된다 - 8진수, 16진수로 출력할려면?

        System.out.println(0x1A); // 26(10진수)

 

printf() 출력형식 지정가능

       System.out.printf("%.2f", 10.0/3);    // 3.33

       System.out.printf("%d", 0x1A);    // 26   // %d : 10진수

       System.out.printf("%x", 0x1A);    // 1A   // %X : 16진수

 

 

 

2.printf() 메소드의 지시자(1/3)

<자주쓰는 지시자>

*이외에 다른 지시자들을 알고싶다면, JavaAPI문서 - Formatter 검색

 

 

2.printf() 메소드의 지시자(2/3)

1)정수를 10진수, 8진수, 16진수로 출력

System.out.printf("%d", 15);  // 15 10진수(decimal number)

System.out.printf("%o", 15);  // 17 8진수(octal number) - 일칠이라고 읽는다.

       8진수에서는 10 1 아니라 8이기 때문

System.out.printf("%x", 15);  //  f  16진수(hexadecimal)

System.out.printf("%x", 15);  //  f  16진수(hexadecimal)

System.out.printf("%s", Integer.toBinaryString(15));  // 1111 2진수 - 10진수15 2진수 1111

       숫자15 위의 메소드에 넣으면 '문자열1111' 얻는다

       그래서 %s 사용하는

       2진수로 출력하는 지시자없음

       정수를 2진수로 변환해주는 toBinaryString() 메소드를 사용해야함

 

2) 8진수와 16진수에 접두사 붙이기

8진수 접두사 : 0

16진수 접두사 : 0x

 

값이 출력될 때는 접두사가 안붙음. 접두사까지 출력하고 싶다면 지시자 앞에 #추가

       System.out.printf("%#o", 15); // 017

       System.out.printf("%#x", 15); // 0xf

       System.out.printf("%#x", 15); // 0XF // 지시자를 대문자로 쓰면, 접두사X F 같이 대문자로 출력됨

 

3)실수 출력을 위한 지시자 %f - 지수형식(%e), 실수 출력의 간략한 형식(%g)

float f = 123.4567890f;

System.out.printf("%f", f); // 123.456787 소수점아래6자리

              마지막숫자9 아니고 7인이유는 float 정밀도가 7자리까지만 정확하기 때문

System.out.printf("%e", f); // 1.234568e+02 지수형식

             같은 수인데 f출력은 456'7'이고 e 456'8'

             실제 저장된 값은 같으나 마지막값을 반올림하여 보여주기때문

System.out.printf("%g", 123.456789); // 123.457 // 소수점포함 7자리로 간략히 보여줌

             마지막수가 6이어야하나 g 반올림해서 7 출력한 . 지시자f처럼 출력

System.out.printf("%g", 0.00000001); // 1.00000e-8

 

실수형태는 %f 많이쓰면 되고, 숫자에 0 많이 들어가면 %e 사용하면 된다

 

실습

 

 

 

2.printf() 메소드의 지시자(3/3)

 

System.out.printf("[%5d]%n", 10);  // [공백공백공백10] 다섯자리

System.out.printf("[%-5d]%n", 10); // [10공백공백공백] - 왼쪽정렬

System.outprintf("[%05d]%n", 10); // [00010] 공백자리를 대체하는 문자 0
 

 

소수점 포함 14자리. 소수점도 하나의 데이로써 메모리 공간을 차지하기 때문

지정된 자릿수보다 출력할 값으 자릿수가 적다면, 소수점 아래는 빈자리를 0으로 채우고 소수점 위는 공백으로 채움

 

 

 

 

 

 

 

728x90
반응형
728x90

2.(data) 타입

 

1)문자 : char

 

2)숫자

         정수 : byte, short, int, long

         실수 : float, double

3)논리 : boolean - true or false

 

위의 8가지가 기본형

 

 

3.기본형 참조형

1)기본형(Primitive type)

 - 8 : boolean, char, byte, short, int, long , float, double

 - 실제 값을 저장

 

2)참조형(Reference type)

 - 기본형을 제외한 나머지 모두(String, System )

 - 메모리 주소를 저장(4byte 또는 8byte)

 - 4바이트 40(4GB)까지 다를 있고, JVM이나 프로그램에서 사용하는 메모리 제외하면 실제 사용 메모리는 2gb 안됨

 - 32bit JVM = 4byte // 64bit JVM = 8byte : 최대40x40=160경바이트(1600TB) 실제는 테라바이트정도 사용가능

 

*기본형 변수는 타입마다 크기가 다름

  - byte : 1byte // short : 2byte // int : 4byte // long : 8byte

  - 참조형은 크기가 항상 4byte

 

Date today;             // 참조형 변수 today 선언

today = new Date();  // today 객체의 주소를 저장

           (객체 생성)

 

728x90
반응형

+ Recent posts