본문 바로가기
[ java ]

[java] 자료형, 증감연산자, 클래스

by 히앤님 2020. 10. 21.
반응형
SMALL

1. 자료형

//패키지 선언
package com.daum.erp;
//클래스 선언
public class test {
//메인 메소드 선언
public static void main(String[] args) {

//변수 선언
String student_name = "히앤";  //문자
int age = 25;  //숫자
double tall = 167.5;  //실수
double weight = 11.1;  //실수
boolean is_marrige = false;  //논리
int is_marrige2 = 3;  //경우의수가 2개 이상인 경우 ex)결혼은 안했는데 자식이 있는 경우

//출력
System.out.println("이름 : " + student_name);
System.out.println("나이 : " + age);
System.out.println("키 : " + tall);
System.out.println("결혼유무 : " + is_marrige);
이름 : 히앤
나이 : 25
키 : 167.5
결혼유무 : false

문자 데이터 "나이 : "와 정수형 age 변수 안의 데이터를 붙인 후 출력하면, 좌우 성분이 다르므로 age 변수안의 18이 문자 18로 변환된다. 자료형은 문자열로 통일된다. 이렇게 자료형이 바뀌는 현상을 형변환(data type conversion)이라고 한다.

 

▼문제

더보기

	----------------------------------------

	<문제>int age = 25; 코딩을 주석처리하면?

	----------------------------------------

	97번째 줄에서 에러 발생.

	선언하지 않은 변수를 하단에서 사용하고 있으므로.

	 

	----------------------------------------

	<문제>System.out.println("나이 : " + age); 코딩을 주석처리하면?

	----------------------------------------

	에러 없음.

	선언한 것을 사용하지 않는 것은 에러가 아니다.

	다만 경고등이 변수 선언 왼쪽에 나온다.

	선언한 변수를 사용하지 않았으므로 걱정해주는 경고가 보인다.

	 

	----------------------------------------

	<문제> = 왼쪽의 변수와 = 오른쪽의 변수는 무슨차이?

	----------------------------------------

	 = 왼쪽의 변수는 데이터 저장을 위한 진짜 변수이고

	 = 오른쪽에 변수는 데이터다. 변수로 보지 말아야함!!!!!!!!!!

	오른쪽에 변수를 데이터로 바꾸어보는 능력이 필요하다.

	 

	----------------------------------------

	<문제> double tall = 167.5; 를 int tall = 167.5;로 수정하면?

	----------------------------------------

	에러 발생.

	int 변수를 선언한 이후 실수형 데이터 167.5를 저장할 수 없기 때문.

	<주의>int가 잘못이 아니라 167.5가 잘못이다.

	int형 변수 선언이 먼저이기 때문이다.

	 

	----------------------------------------

	<문제> int tall = 18; 를 double tall = 18;로 수정하면?

	----------------------------------------

	에러 없음.

	double형 변수 안에 정수형 저장이 가능하다.

	실수는 정수를 커버할 수 있다.

	다만 실수형 변수안에 정수형 데이터를 저장하는 과정 중에

	정수 18이 실수 18,0으로 형변환이 발생한다.

	결국 변수 tall에는 18.0이 저장되어 있다.        

	 

	----------------------------------------

	<문제> 하나의 변수 안에 하나의 데이터만 저장이 가능하다.

	하나의 변수 안에 n개의 데이터를 저장할 수 있는가?

	----------------------------------------

	하나의 변수 안에 데이터를 저장하는 방법은 두가지.

	1. 배열을 쓰는 방법 2. collection을 사용하는 방법

	둘다 객체 분야이므로 추후 배울 예정.

	 

	예)

	double [] kor = {80.5,90.5,33.4,27,5};

	 

	----------------------------------------

	<별외문제> 단 하나의 코딩으로 int형 100개의 변수를 만들수 있는가?

	----------------------------------------

	int[] xxx = new int[100];

	변수명은 xxx[0] ~ xxx[99]의 변수 100개가 만들어진다.

	데이터 저장은

	xxx[0]= 정수;

	xxx[1]= 정수;

	xxx[2]= 정수;

	등등으로 쓰면 됨.

	 

	----------------------------------------

	<문제> System.out.println("나이 : " + age); 코딩을

	String student_name = "해인"; 위로 이동시키면?

	----------------------------------------

	에러발생.

	변수 선언 이전에 변수를 사용할 수는 없다.

	반드시 변수 선언 이후 변수를 사용해야한다.

	 

	----------------------------------------

	<문제> String student_name = "해인"; 코딩을

	char student_name = "해인"로 수정하면?

	----------------------------------------

	에러발생.

	char형은 기본형이고, 선언된 변수는 싱글쿼트(')로 감싼 

	1개의 문자만 저장이 가능하기 때문.

	결국 char형으로 선언된 변수에 string형 데이터를 

	저장하고 있기 때문에 에러가 발생함.

	싱글쿼트(')로 바꿔도 단어가 2개 이상이므로 에러.

	 

	-------------------------------------------

	string형은 객체형이다. 객체형이지만 기본형만큼 많이 쓰임.

	나중에 배움.

	 

	--------------------------------------------

	<문제> 변수를 모두 선언한 이후 사용하지 말고

	하나의 변수를 선언하고 발로 사용하는 코딩을 쓰면 안되나?

	--------------------------------------------

	문법적으로 에러가 발생하지는 않으나 관용적인 규칙상

	모든 변수는 상단에 몰아서 선언하는게 더 코딩상 좋다.

	관용적인 규칙상 = 개발자끼리의 암시적 약속

	--------------------------------------------
    
    	<문제> null값에 대해 설명하세요.

	"이방언"(문자형) '권' (문자형) 888(정수형) 435.333(실수형)

	null은 참조형 데이터이다.

	참조형은 객체 메모리 위치 주소값이다.

	null의 의미 : 객체의 메모리 위치 주소값이 아직은 없어...

	자료형의 종류는 참조형이나, 의미는 객체 메모리가 
	나중에 들어갈 것을 이야기하는 더미 데이터임.

	String actor = null;
	-> 에러 안남.

	int actor = null;
	->에러남.

 

2. 형변환

package test;
public class test {
public static void main(String[] args) {
	int num1 = 5;
    int num2 = 2;
    double num3 = num1/num2;
    System.out.println("num3 => " + num3);
}
}
num3 => 2.0

=> num1/num2 연산 결과인 int형 2가 double 형 변수에 저장되므로 2에서 2.0으로 변환된다.

=>데이터끼리의 연산시 자료형이 서로 틀리면 한쪽이 다른쪽에 맞춰 자료형이 변환되고 데이터를 변수에 저장할 경우에도 데이터가 변수의 자료형으로 변환된다.

 

package test;
public class test {
public static void main(String[] args) {

	int num7 = 5;
    double num8 = 2;
    double num9 = num7/num8;
    System.out.println("num9 => " + num9);
    
	double num10 = 5;
    int num11 = 2;
    double num12 = (int)num10/num11;
    System.out.println("num12 => " + num12);

}
}
num9 => 2.5
num12 => 2.0  (역순으로도 형변환 가능)

=>(double)이 num7의 5를 double형 5.0으로 변환시킨다. (int)이 num13의 5.0을 int형 5로 변환시킨다.(명시적형변환)

=>num8도 num7에 따라 double형 변환된다(암시적형변환) 형변환을 표시하기 위해 앞에 붙인 (int)를 cast연산자라고 한다.

 

 

이 이후 패키지, 클래스, 메인메소드 생략.

 

 

3. 증감연산자

int kor = 90;
kor = kor +1; // ++kor; 또는 kor++;도 가능
System.out.println("kor =>" + kor);
kor => 91

연산자가 앞 또는 뒤에 붙는 것에 따라 값이 증가하는 시기가 다르다.

앞이면 연산하기 전 미리 값이 증감되고, 뒤에 붙으면 결과가 출력된 후 값이 증감된다.

 

▼연습문제

더보기

int num1 = 20;
int num2 = ++num1;
System.out.println("num1 =>" + num1);
System.out.println("num2 =>" + num2);


int num3 = 20;
int num4 = num3++;
System.out.println("num3 =>" + num3);
System.out.println("num4 =>" + num4);


int num5 = 20;
++num5;
System.out.println("num5 =>" + num5);


int num6 = 20;
num6++;
System.out.println("num6 =>" + num6);


int num7 = 20;
int num8 = ++num7 + num7 ;
System.out.println("num7 =>" + num7);
System.out.println("num8 =>" + num8);


int num9 = 20;
int num10 = num9++ - num9 ;
System.out.println("num9 =>" + num9);
System.out.println("num10 =>" + num10);        


int num11 = 20;
int num12 = num11++ - ++num11 ;
System.out.println("num11 =>" + num11);
System.out.println("num12 =>" + num12);        


int num13 = 20;
int num14 = num13++ + num13++ ;
System.out.println("num13 =>" + num13);
System.out.println("num14 =>" + num14);        


int num15 = 20;
int num16 = ++num15 - num15-- ;
System.out.println("num15 =>" + num15);
System.out.println("num16 =>" + num16);        


int num17 = -3;
int num18 = 6;
int num19 = num17 - --num17 + num17-- + num18-- ;
System.out.println("num17 =>" + num17);
System.out.println("num18 =>" + num18);        
System.out.println("num19 =>" + num19);        


int num20 = 0;
int num21 = -3;
int num22 = num20*2 - --num21 + num21++ + ++num20*3 ;
System.out.println("num20 =>" + num20);
System.out.println("num21 =>" + num21);        
System.out.println("num22 =>" + num22);        


int num23 = 0;
int num24 = -3;
int num25 = num23-- - --num23 + ++num24 + --num24 +num25-- ;
System.out.println("num23 =>" + num23);
System.out.println("num24 =>" + num24);        
System.out.println("num25 =>" + num25);

 

<답안>
num1 =>21
num2 =>21
num3 =>21
num4 =>20
num5 =>21
num6 =>21
num7 =>21
num8 =>42
num9 =>21
num10 =>-1
num11 =>22
num12 =>-2
num13 =>22
num14 =>41
num15 =>20
num16 =>0
num17 =>-5
num18 =>5
num19 =>3
num20 =>1
num21 =>-3
num22 =>3
num23 =>0
num24 =>-3

num25 =>에러


 

4. 클래스

package test;
public class Test {

//속성변수 선언
	private int kor;
	private int eng;
	private int mat;	

//생성자 선언
	public test(int kor, int eng, int mat) {
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;				
	}

//메소드 선언(getter/setter)
public int getKor() {								
	return kor;									
}										
public int getEng() {
	return eng;	
}		
public int getMat() {
	return mat;	
}		
public int getTot() {
	return kor+eng+mat;	
}	
public double getAvg() {
	return getTot()/3.0;	
}	
public void setKor(int kor) {
	this.kor = kor;	
}	
public void setEng(int eng) {
	this.eng = eng;	
}
public void setMat(int mat) {
	this.mat = mat;	
}
}

▼설명 보기

더보기

package sungjuk;

//---------------------------------------
//성적을 관리하는 클래스 선언
//<주의> 클래스 이름은 의미있게 주어야하고
//첫글자 대문자가 관용적임.
//---------------------------------------

public class sungjukExe {
	
	
//---------------------------------------
//<1>속성변수 선언
//---------------------------------------

	//국어점수가 저장되는 속성변수 kor 선언
	private int kor;
	
	//영어점수가 저장되는 속성변수 eng 선언
	private int eng;
	
	//수학점수가 저장되는 속성변수 mat 선언
	private int mat;	
	
//---------------------------------------
//<2>생성자 선언
//생성자는 객체 생성시 단한번만 호출됨
//<주의>생성자 객체 생성 후 인위적으로 다시 호출할 수 없다.
//---------------------------------------
	
	//만약 생성자가 default로 비어있으면
	//public sungjuk(){} 가 생김. 비어있으므로 점수 선언할 수 없음
	
	public sungjuk(int kor, int eng, int mat) {

		//매개변수명과 속성변수명이 동일할 경우 속성변수 왼쪽에 this를 붙인다.
		//매개변수 kor로 들어오는 데이터를 속성변수 kor에 저장하기
		this.kor = kor;
		
		//매개변수명과 속성변수명이 동일할 경우 속성변수 왼쪽에 this를 붙인다.
		//매개변수 eng로 들어오는 데이터를 속성변수 eng에 저장하기
		this.eng = eng;
		
		//매개변수명과 속성변수명이 동일할 경우 속성변수 왼쪽에 this를 붙인다.
		//매개변수 mat로 들어오는 데이터를 속성변수 mat에 저장하기
		this.mat = mat;		
		
	}
	
//---------------------------------------
//<3>메소드 선언
//---------------------------------------
	
	//속성변수 kor의 데이터를 리턴하는 메소드 선언
	public int getKor() {								//메소드 왼쪽의 자료형과
		return kor;										//return의 오른쪽 데이터 유형이 같아야함
	}													//return 의미는 메소드 중지라는 의미
	//속성변수 eng의 데이터를 리턴하는 메소드 선언
	public int getEng() {
		return eng;	
	}	
	
	//속성변수 eng의 데이터를 리턴하는 메소드 선언
	public int getMat() {
		return mat;	
	}	
	
	//총점을 리턴하는 메소드 선언
	public int getTot() {
		return kor+eng+mat;	
	}	
	//평균을 리턴하는 메소드 선언(평균이니까 실수로)	
	public double getAvg() {
		return getTot()/3.0;	
	}	

	//같은 클래스 내부에 속성변수나 메소드 이름이 동일하게 선언되면 안됨
	//하지만 생성자는 유일하게 똑같은 이름으로 여러개 선언 가능
	

	//----------

	
	//속성변수 kor에 데이터를 삽입하는 메소드 선언
	public void setKor(int kor) {
		this.kor = kor;	
	}
	
	//속성변수 eng에 데이터를 삽입하는 메소드 선언
	public void setEng(int eng) {
		this.eng = eng;	
	}
	
	//속성변수 mat에 데이터를 삽입하는 메소드 선언
	public void setMat(int mat) {
		this.mat = mat;	
	}

}
-------------------------------------------------------
<문제1>public class Sungjuk { 를 class Sungjuk {로 고치면?
-------------------------------------------------------
com.naver.erp 안의 SungjukExe 클래스 안에서 에러 발생.
com.naver.erp 안의SungjukExe 클래스 입장에서 타 패키지에 있는 
클래스를 사용할 경우 수입을 해야한는데 수입하는 코드 
import com.google.erp.Sungjuk;거 없으므로 에러가 발생한다.
com.google.erp 안의SungjukExe 클래스 안에서 에러가 발생하지 않는 이유는 
동일한 패키지 안의 타 클래스는 자동수입 되기 때문이다.

-------------------------------------------------------
<문제2>private int kor;에서 속성변수 kor에는 뭐가 들어있나?
-------------------------------------------------------
0이 저장되어 있다.
속성변수는 데이터를 저장하지 않으면 디폴트값이 저장된다.
왜? 메소드 안에 선언되는 지역 변수와 달리 속성변수는 클래스를 구성하는
중요한 요소이므로 자동초기화가 된다.


-------------------------------------------------------
<문제3>private int kor;에서 private double kor;로 수정하면?
-------------------------------------------------------
에러발생.
	public int getKor() {return kor;}
부분에서 에러가 난다. return kor; 코드에 의해 실수가 리턴되는데
리턴되는 자료형은 int로 저장했으므로 에러 발생.


-------------------------------------------------------
<문제4>private int kor;에서 private final double kor;로 수정하면?
-------------------------------------------------------
에러없음.(final 갱신금지인데 0->99가 되고 다른곳도 에러안남)
이러고 this.kor=kor; 주석처리하면 에러남
속성변수는 생성되고 나서 아무것도 안넣어주면 자동으로 넣어줌(0이라도)
근데 final 붙이면 아무것도 안넣어주는 진공상태가 됨.(기본서비스 안해줌)
때문에 생성자 안에서라도 집어넣어줘야하는데 그것도 주석처리 되면
에러가 됨.(예외적으로 자동초기화가 되지 않음)

final은 내가 원하는 값을 넣고 잠궈서 고치지 말라는건데 0은 내가 원하는
값이 아니므로 기본적으로 데이터를 안넣어주고 진공상태로 놔둠.
사용자가 원할때(생성자에서) 너가 원하는거 집어넣으라는 소리.

private final int kor = 90;는 말이 됨. 값을 넣고 잠군거니까.

------
선생님 답변)에러 없음.
final 붙는 속성변수는 예외로 자동 초기화가 되지 않는다.
그러므로 개발자가 수동 초기화를 하여야한다.
수동 초기화 할때는 속성변수선언 할 때 또는 생성자 안에서 초기화할때다.
현재 속성변수 선언할 때는 수동초기화하지 않았지만 생성자 안에서
수동초기화했으므로 에러는 발생하지 않는다.
만약 생성자 안의 this.kor= kor; 을 생략하면 에러가 발생한다.


-------------------------------------------------------
<문제5>public int getKor() {return kor;}를 
public double getKor() {return kor;}로 수정하면?
-------------------------------------------------------
에러없음.
리턴 자료형이 double이고 실제 리턴되는 데이터가 정수면
정수가 실수로 변하므로 형변환이 되어 리턴된다.(정수 ⊂ 실수)

-------------------------------------------------------
<문제6>public int getKor() {return kor;}를 
int getKor() {return kor;}로 수정하면?
-------------------------------------------------------
에러발생.
com.naver.erp 안의 SungjukExe 클래스 안에서 에러 발생.
메소드 맨 앞의 접근 지정자가 defalt면 타패키지의 타 클래스에서의
호출을 금지한다.

-------------------------------------------------------
<문제7>public Sungjuk(int kor, int eng, int mat) { 를
Sungjuk(int kor, int eng, int mat) { 로 바꾸면?
-------------------------------------------------------
에러발생.
com.naver.erp 안의 SungjukExe 클래스 안에서 
Sungjuk xxx = new Sungjuk(99,88,77); 에러 발생.
생성자에 접근 지정자가 defalt면 동일한 패키지 안의 타클래스에서만
객체화할 때 보이고 타 패키지의 타 클래스에서 안보이게 한다.


-------------------------------------------------------
<문제8>public Sungjuk(int kor, int eng, int mat) { 를
private Sungjuk(int kor, int eng, int mat) { 로 바꾸면?
-------------------------------------------------------
에러발생.
com.naver.erp 안의 SungjukExe 클래스 안과
com.google.erp 안의 SungjukExe 클래스 안에서  모두 에러 발생.
생성자에  private가 붙으면 그 어떤 타 클래스에 객체 생성과정중에
생성자를 찾을 수없게 한다. 결국 타 클래스에서 객체생성을 막는 것임.
생성자에  private가 붙는 클래스는 대부분 속성변수나 메소드에
static 을 붙여 객체 생성없이 호출하도록 설정 되어 있다.
즉, 객체 생성 없이 그냥 써라 라는 의미가 있다.


-------------------------------------------------------
<문제9>public Sungjuk(int kor, int eng, int mat) { 를 삭제하면?
-------------------------------------------------------
에러발생.
얘를 가져다 쓰는 애들이 없는 생성자를 찾고 있으니 에러가 날 수밖에.
--------------------
com.naver.erp 안의 SungjukExe 클래스 안과
com.google.erp 안의 SungjukExe 클래스 안에서  모두 에러 발생.
아래 객체 생성 과정 중에 Sungjuk(int kor, int eng, int mat) {
가 있는 생성자를 가진 클래스를 찾아 객체화 하는데, 이 생성자를
삭제하면 찾을수가 없어서 객체화를 실패함.

cf)만약 생성자가 코딩상 0개면 자바는 디폴트 생성자를 삽입해준다.
즉 이 클래스에서는 public Sungjuk() {}를 삽입해준다.

	-------------------------------------
	Sungjuk xxx = new Sungjuk(99,88,77);
	-------------------------------------	
		
	//<1> Sungjuk xxx에 의해 변수 xxx를 선언.
	//	  xxx 변수 안에는 "Sungjuk 클래스를 객체화했을때 메위주가 들어갈 예정"
	//<2> new에 의해 수입된 클래스 중에 Sungjuk(~,~)형식의 생성자를 가진 클래스를 찾아서
	//	  그 클래스를 메모리 공간으로 올린다.(=객체화)
	//<3> 메모리 공간에 올려진 객체에서 Sungjuk(int kor, int eng) 형식의 생성자를
	//	  Sungjuk(99,98) 이름으로 호출한다.(즉, 외부에서 데이터가 주입됨)
	//<4> Sungjuk 객체의 메위주를 리턴해서 xxx에 삽입.


-------------------------------------------------------
<문제10>public Sungjuk{를 public final Sungjuk{로 수정하면?
-------------------------------------------------------
여기에는 에러 없음.
클래스 앞의 final은 자식클래스를 가지지 않겠다라는 의미이다.
현재 Sungjuk클래스의 자식 클래스가 없기 때문에 에러가 발생하지 않는다.
그러나 만약 final이 붙은 상태에서 타 클래스가 자식으로 들어온다면
에러는 자식쪽에서 난다.(Student.java)

추후 상속(=inheritance) 에서 자세히 배울 예정.


-------------------------------------------------------
<문제11>public Sungjuk{를 public abstract Sungjuk{로 수정하면?
-------------------------------------------------------
에러발생.
com.naver.erp 안의 SungjukExe 클래스 안과
com.google.erp 안의 SungjukExe 클래스 안에서  모두 에러 발생.
클래스 앞에 abstract가 붙으면 객체 생성을 불가능하게 만든다.
그런데 SungjukExe 안에서 객체생성을 시도하고 있어서
에러가 발생한다.

 

4-1. 성적 객체 생성

//---------------------------------------
//소속 패키지 선언
//---------------------------------------
package sungjuk;

//---------------------------------------
//Sungjuk 클래스를 객체화하고 메소드를 호출하기
//SungjukExe 선언
//---------------------------------------

public class sungjukExe {

	public static void main(String[] args) {


//------------------------------------
//클래스명 변수명(메위주) = 메위주 내용
//------------------------------------

		
		Sungjuk xxx = new Sungjuk(99,88,77);
		
		//------------------------------------------------------------------
		//이 한줄이 갖는 의미가 4가지나 됨.

		//<1> Sungjuk xxx에 의해 변수 xxx를 선언.
		//	  xxx 변수 안에는 "Sungjuk 클래스를 객체화했을때 메위주가 들어갈 예정"
		//<2> new에 의해 수입된 클래스 중에 Sungjuk(~,~)형식의 생성자를 가진 클래스를 찾아서
		//	  그 클래스를 메모리 공간으로 올린다.(=객체화)
		// new : 메모리공간을 올려주는 역할
		//<3> 메모리 공간에 올려진 객체에서 Sungjuk(int kor, int eng) 형식의 생성자를
		//	  Sungjuk(99,98) 이름으로 호출한다.(즉, 외부에서 데이터가 주입됨)
		//<4> Sungjuk 객체의 메위주를 리턴해서 xxx에 삽입.
		//------------------------------------------------------------------
		
		//객체 참조 변수 = 객체 메위주를 가지고 있는 변수
		
//------------------------------
//메위주 아니까 데이터 불러와봐!
//------------------------------
		
		//Sungjuk 객체의 getKor() 메소드를 호출하여 얻은 국어점수 호출하기
		//객체의 메소드 호출 형식은 객체 메위주.메소드명(~)이다.
		System.out.print(xxx.getKor() + " ");
		
		//Sungjuk 객체의 getKor() 메소드를 호출하여 얻은 국어점수 호출하기
		//객체의 메소드 호출 형식은 객체 메위주.메소드명(~)이다.
		System.out.print(xxx.getEng() + " ");
		
		//Sungjuk 객체의 getKor() 메소드를 호출하여 얻은 국어점수 호출하기
		//객체의 메소드 호출 형식은 객체 메위주.메소드명(~)이다.
		System.out.print(xxx.getMat() + " ");		

		//Sungjuk 객체의 getTot() 메소드를 호출하여 얻은 총점 호출하기
		System.out.print(xxx.getTot() + " ");
		
		//Sungjuk 객체의 getAvg() 메소드를 호출하여 얻은 평균 호출하기
		System.out.print(xxx.getAvg() + " ");		

	}

}

4-2. 성적객체에게 부모가 되어달라는 학생객체

//성적에게 부모 되어달라고 하는 자식

package com.google.erp;


//학생 클래스는 부모가 성적이에요.
//에러 없으면 받아준 것. 에러 있으면 엄마는 final

public class Student extends Sungjuk {

	Student(){
		super(99,99,89);
	}

}
반응형
LIST

댓글