<2> 생성자 (Constructor)


1. 두 명의 과일장수와 한 명의 구매자  

1) 과일장수1 : 보유하고 있는 사과의 수 30개, 개당 가격은 1500원

   과일장수2 : 보유하고 있는 사과의 수 20개, 개당 가격은 1000원

인 두명의 과일장수에서 '나' 가 

"나는 과일장수1에게 4500원어치 사과를 구매했고, 과일장수2에게 2000원어치 사과를 구매했다" 를 실행할 예정 

2) 문제점 : 두 개의 과일장수 인스턴스를 생성해야 하고 과일장수의 사과 보유 수 및 가격이 다르기 때문에 인스턴스 변수의 초기값도 달라져야 함 

- > 인스턴스를 생성 하고 나서 인스턴스 변수 초기화. : FruitSeller class에  인스턴스 변수를 초기화 하는 initMember 메소드를 넣었다.  




//참조변수 seller1과 seller2는 다르다! 같은 class 에서 각기 다른 주소에 각기 다른 객체 생성, 그 주소를 넘겨주는 것.

//FruitSeller seller1 = new FruitSeller(); 

 FruitSeller seller2=seller1; 

 와 다르다  


: 이 코드의 문제점 

- 인스턴스를 생성하고 난 다음에 또 변수를 초기화 하기 때문에 2줄에 걸쳐서 문장을 구성해야 한다. 

(많은 인스턴스가 생성되면 큰 문제점이 될 수 있음)

-FruitSeller 클래스의 인스턴스변수 APPLE_PRICE의 final선언이 없어짐. 


-> 프로그래머가 실수로 final선언하지 못한 변수를 수정할 시에 치명적인 문제가 생길 수 있다   

(메소드는 여러번 사용할수 있기 때문에 메소드 안에 final 변수는 초기화가 불가능하다.)


↓ 해결방안


2. 생성자(constructor)  

: 딱 한번만 호출되는 메소드, 인스턴스변수의 초기화를 위해 정의됨. (final변수 선언 가능)





1) 생성자가 되기 위한 조건 : 

- 클래스와 동일한 이름의 메소드

- 반환형이 선언되어 있지 않으면서, 반환하지 않는 메소드


2) 인스턴스가 생성될 때 마다 생성자가 호출되어야 한다. : 생성자는 딱 한번 호출된다. 

- New Number : Number의 인스턴스 생성 

- Number(); : Number() 생성자 호출  



3. 생성자의 정의

1) 생성자는 다른 메소드들과 같이 값을 전달받을 수 있다. 받는형태도 자유


: 생성자를 사용하면 인스턴스 변수의 초기화를 한결 수월하게 진행할 수 있다! 



4. 코드의 개선

내가 생성자를 사용해서 해본 것



- 책에 나온 코드 : FruitBuyer 클래스에서도 생성자를 사용했다  





5. 생성자가 없어도 인스턴스 생성이 가능한 이유 : 디폴트 생성자(Default Constructor)

지난 게시물의 사과장수코드에서는 생성자가 정의되어 있지 않음에도 불구하고 FruitSeller seller=new Fruitseller(); 등등을 통해 인스턴스 생성 및 생성자 호출을 하였다. 그리고 인스턴스 생성과정에서는 반드시 생성자가 호출되어야 하는데 오류가 나지 않았던 이유 : 디폴트 생성자 


1) 디폴트 생성자 : 프로그래머가 클래스 안에 생성자메소드를 삽입하지 않으면 자바컴파일러가 자동으로 삽입해 주는 생성자. 

예시 ) FruitSeller의 디폴트 생성자 

public FruitSeller() 

{

// 텅 비어있다! 


}


* 디폴트생성자는 public 일수도 있고 아닐수도 있다 -이후에 공부 




<3> 자바의 이름 규칙 (Naming rule) : 문법과 관계는 없지만 다른 사람에게 보여주거나 다른 사람의 것을 볼 때 사용하는게 유용하다 (관례적인 표현)


1. 클래스의 이름 규칙 : 'Camel Case'

1) 첫문자는 대문자

2) 둘 이상의 단어가 묶여서 하나의 이름을 구성할 때 새로 시작하는 단어는 대문자

ex ) circle point -> CirclePoint


2. 메소드와 변수의 이름 규칙 : 클래스와 구분되어야 한다. 변형된 Camel Case

- 첫 문자를 소문자 

ex ) addYourMoney, yourAge


3. 상수의 이름 규칙 : 구분이 되기 위해 모든 문자 대문자로 하는것이 관례 

final int COLOR=7;

+) 단어가 연결되어야 하는경우 언더바

final int COLOR_RAINBOW=7;




문제 1. 

아래의 문제에서 요구하는 클래스들을 정의하되, 위에서 설명한 Camel Case 이름 규칙을 적용하여 메소드와 변수, 클래스 이름 지어주기. 정의한 클래스 확인을 위한 main 메소드도 적절의 정의. 


Q1. 밑변과 높이 정보를 저장할 수 있는 Triangle 클래스 정의. 생성과 동시에 초기화가 가능한 생성자도 정의. 밑변과 높이 정보를 변경시킬수 있는 메소드와 삼각형의 넓이를 계산해서 반환하는 메소드도 함께 정의


내가 만들어본 코드 : 



책의 코드 : 변수 지정 간단하게, 밑변과 높이의 변경을 따로따로 했다. 중간에 확인하는 출력과정 없음 




Q2. 구슬치기 


다음 조건에 만족하는 클래스 정의 

- 어린아이가 소유하고 있는 구슬의 갯수 정보 담을 수 있다 

-놀이를 통한 구슬의 주고받음을 표현하는 메소드 존재

-어린이의 현재 보유자산(구슬의 수)을 출력하는 메소드 존재


두번째 조건은 두 아이가 구슬치기를 하는 과정에서 구슬을 잃고 얻음을 의미하는것. 위의 조건을 만족하는 클래스를 정의하였다면 다음 조건을 만족하는 인스턴스 각각 생성 

- 어린이1의 보유자산 : 구슬 15개

- 어린이2의 보유자산 : 구슬 9개


인스턴스의 생성이 완료되면 다음상황을 main메소드 내에서 시뮬레이션 

- 1차 게임에서는 어린이1은 어린이2의 구슬 2개 획득 

- 2차 게임에서는 어린이2는 어린이1의 구슬 7개 획득 


마지막으로 각각의 어린이가 보유하고 있는 구슬의 수 출력하면서 프로그램 종료. 


- 내가 만든 코드





- 책의 코드 : 진 어린이가 줘야 하는 구슬 수가 어린이가 가진 구슬 수보다 클 때의 경우가 있다. -단순 변경이 아닌 return 사용







 








<1> 클래스의 정의와 인스턴스 생성 : 완벽한 개체지향 언어 java

 

1. 객체지향 프로그래밍의 이해

1) 객체 (object) : 물건, 또는 대상

 

2) 객체지향 프로그래밍

example)

"나는 과일장수에게 두 개의 사과를 구매했다 ! " 에서

객체 : 나, 과일장수, 사과

액션 : 객체 '사과'의 구매, 객체 '사과'의 판매

-> 객체지향 프로그래밍에서는 객체(나, 과일장수)를 등장시킬 수 있을 뿐만 아니라 행위('나'라는 객체가 '과일장수'로부터 '사과'구매, '과일장수'가 '나'에게 '사과'판매) 도 그대로 표현할 수 있다.

 

- 객체지향 프로그래밍 : 현실에 존재하는 사물과 대상, 그리고 그에 따른 행동을 있는 그대로 실체화 시키는 형태의 프로그래밍

* 뒤의 내용부터 코드의 간결성을 위해 '사과'는 객체화 시키지 않는다.

 

 

 

2. 객체는 데이터와 기능으로 이루어진다.

1) 객체 과일장수 : "과일의 판매"

- 과일을 판다 행동(behavior)  

- 과일장수는 사과 20개, 오렌지 10개 보유 상태(state)

- 과일장수의 과일판매 수익은 50,000원 상태(state)

:

(1) 객체는 하나 이상의 상태 정보(데이터)와 하나 이상의 행동(기능)으로 구성

(2) 상태 정보는 변수를 통해서 표현(변수에 상태 정보를 저장할 수 있으므로), 행동은 메소드를 통해서 표현

 

2) 과일장수의 상태 정보 표현(변수) *사과만 판다고 가정

-보유하고 있는 사과의 수 -> int numOfApple;

-판매 수익 -> int myMoney;

 

3) 과일장수의 행위(과일판매) 표현 (메소드) *이 메소드 내에서 과일장수의 현재상태를 나타내는 위의 변수에 직접 접근 가능하다고 가정

 

int saleApple(int money) //사과 구매액이 메소드의 인자로 전달

{

int num=money/1000; //사과가 개당 1000원이라고 가정

numOfApple-=num; //사과의 수가 줄어들고

myMoney+=money; //판매 수익 발생

return num; //실제 발생한 사과의 수 반환

}

 

 ============↓ 이들을 묶어서 객체라는 것을 통해 실체화* ===================*

 

 

 

3. 클래스(class)라는 틀을 기반으로 객체 생성

: '나' 또는 '과일장수'로 객체를 생성하기 위해선 둘을 위한 틀을 만들어야 한다.

1) 틀 구성 방식

class FruitSeller

{

int numOfApple=20;

int myMoney=0;    //변수선언

 

public int SaleApple(int money)

{

int num = money/1000;

numOfApple-=num;

myMoney+=money;

return num;

}    //메소드 정의

}

 

2) 클래스 

-class FruitSeller : FruitSeller라는 이름의 틀 정의 , 틀 = 클래스(class)

 

3) 클래스의 구성 요소

-위 예제에서 2개의 변수, 하나의 메소드 : 클래스는 객체를 구성하는데 필요한 변수와 메소드로 구성

-메소드 내에서 동일한 클래스 안에 선언된 변수에 접근 가능

*static 키워드 삽입 x  (-> chpter10에서 배움)

 

 

 

---- "나는 과일자수에게 2000원을 주고 두 개의 사과를 구매했다" 시뮬레이션 하기 위해 필요한 클래스 정의-----**

;

4. '과일장수' 클래스 정의와 키워드 final 

- 과일장수 클래스에 추가 : "2,000원 벌었어, 남은 사과는 18개 이고 말이야!" 라고 말하는 행위

1) '과일장수' 클래스 정의 FruitSeller

 

class FruitSeller

{

final int APPLE_PRICE=1000;    //사과 가격

int numOfApple=20;

int myMoney=0;

 

public int saleApple(int money)

{

int num=money/APPLE_PRICE;

numOfApple-=num;

myMoney+=money;

return num;    //판매한 과일의 수 반환

}

public void showSaleResult()

{

System.out.println("남은 사과 : "+numOfApple);

System.out.println("판매 수익 : "+myMoney);

}

}

 

-showSaleResult 메소드 추가

-final int APPLE_PRICE=1000; 으로 사과 가격 추가

 

2) 키워드 final

- final 변수 : final 키워드 삽입 후 선언한 변수 (변수가 상수화 된것이기 때문에 final 상수라고도 한다)

- final 선언 : " 한번 값이 결정된 이 변수의 값은 변경이 불가능하다!" - 지역변수로 final이 선언되면 딱 한번 값의 초기화가 가능

- 선언과 동시에 초기화 아닌 선언만 하는 것 가능.

 

final int APPLE_PRICE;

 

-> 딱 한번 초기화 가능

 

APPLE_PRICE=1000;

 

 

5. '나(me)' 클래스 정의

1) 삽입할 변수 ('나'의 상태) : 돈, 물품  

-소유하고 있는 현금 -> int myMoney;

-소유하고 있는 사과의 수 -> int numOfApple;

 

2) 삽입할 메소드 ('나'의 행위) : 과일의 구매 -> buyApple의 메소드 정의

 

3) '나'의 클라스 정의 FruitBuyer

 

class FruitBuyer

{

int myMoney=5000;

int numOfApple=0;

 

public void buyApple(FruitSeller seller, int money)

{

numOfApple+=seller.saleApple(money);

myMoney-=money;

}

public void Result()

{

System.out.println("현재 잔액 : "+myMoney);

System.out.println("사과 개수 : "+numOfApple);

}

}

 

** 보라색으로 표시한 내용은 뒤에서 설명될 것이다

 

 

--------------------------------------------------------클래스 정의 끝--------------------------------------------------*

6. 클래스를 기반으로 객체 생성하기

" 위에서 정의한 클래스들은 '틀'에 불과하다. 따라서 접근도 호출도 불가능하다 "-> 정의한 클래스 실체화, 즉 객체화

 

↓ 자바에서 정의하고 있는 객체 생성방법

ClassName name = new ClassName();

 

FruitSeller클래스와 FruitBuyer클래스 객체 생성방식 :

FruitSeller seller = new FruitSeller();

FruitBuyer buyer = new FruitBuyer():

 

1) 대입 연산자의 오른편 new FruitSeller(); / new FruitBuyer();

(1) new : 객체생성 명령하는 명령어. "Fruit~ 객체를 생성하라! "

-> 메모리 공간에 객체 생성. 인스턴스화 (instantiation) , 생성된 객체-인스턴스(intstance)

(2) 클래스와 객체의 차이점 ( 메모리 관점 )

 -클래스에 존재하는 변수와 메소드는 메모리 공간에 할당된 형태로 존재 x, 접근도 호출도 불가능.(틀로서만 역할)

 -객체는 메모리 공간 할당, 접근과 호출 가능.

 

2) 대입 연산자의 왼편 FruitSeller seller = ... ; / FruitBuyer buyer = ...;

: int num; 과 같은 선언문과 같은 구조. 자료형(FruitSeller or FruitBuyer)가 왼편, 변수의 이름(seller or buyer) 오른편

- 클래스를 정의하는 것은 자바에서 제공하는 기본 자료형 이외에 프로그래머가 새로운 이름의 자료형을 정의하는 것

 

3) 객체 생성 문장 총 정리 분석

(1) FruitSeller seller = new FruitSeller();  : FruitSeller 객체를 생성하고 이를 seller라는 이름의 변수로 참초

(2) FruitBuyer buyer = new FruitBuyer():   :FruitBuyer 객체를 생성하고 이를 buyer라는 이름의 변수로 참조

 

-> 이 두 문장이 실행된 이후로는 각각의 개체에 seller, buyer를 통해서 접근 가능

-> seller & buyer : 참조변수

 

 

 

7. 객체 생성과 참조의 관계

: 키워드 new에 의한 객체 생성시 생성된 객체는 메모리에 저장되고, 저장된 메모리의 주소 값이 반환, 선언된 참조변수에 저장.

 

- 주소값이 저장되었기 때문에 다음의 문장 구성 가능

FruitSeller seller1=new FruitSeller();

FruitSeller seller2=seller1;

 

-> 두 개의 참조변수가 하나의 객체를 참조.

 

** new에 의해 반환되는 주소 값 : 자바에서는 new에 의해 반환되는 주소 값( 참조변수가 저장하고 있는 값 ) 을 '참조' , reference 라고 한다.

 

 

 

===============================객체로의 실체화 끝 =====================================*

8. 생성된 객체의 접근방법

" 연산자를 이용해서 객체의 변수 또는 메소드에 접근한다 " *접근이 가능하려면 접근권한이 있어야 한다. 다음 챕터에서 다룸

1) 참조변수 seller의 예

- seller가 참조하는 객체의 변수 numOfApple에 값 저장하기

seller.numOrApple=20;     //seller가 참조하는 객체의 변수 numOfApple에 20저장

- seller가 참초하는 객체의 메소드 호출

seller.saleApple(10);     //seller가 참조하는 객체의 메소드 saleApple 호출

 

 

 

9. 참조변수와 메소드의 관계

 

public void myMethod()

{

FruitSeller seller1 = new FruitSeller();

instMethod(seller1); //seller1 이 메소드의 매개변수로 전달됨!

}

public void instMethod(FruitSeller seller2) //매개변수 형이 FruitSeller이다.

{

...

}

 

instMethod라는 이름의 메소드 호출, 참조변수 seller1에 저장된 값 전달, instMethod는 seller2라는 이름으로 받음.

 

 

메소드를 호출하면서 참조변수를 전달하는 상황에서 생각할 수 있는 값의 전달 진행의 경우 

1) 참조변수가 메소드의 인자로 전달되면 동일한 형태의 객체가 생성되어(복사) 매개변수가 이를 별도로 참조.  -x

2) seller2에 seller1이 젖아하고 있는 객체의 참조 값(주소 값)이 전달되는 상황. - seller1과 seller2가 하나의 객체를 동시에 참조. -o

 

 

 

 

- 3~13 : Number라는 이름의 클래스 정의, (클래스 안에 존재하는 메소드와 변수의 위치 상관 x)

- 19 : 객체 생성. 참조변수는 nInst

- 20 : nInst가 참고하는 객체의 getNumber 메소드 호출. -> 객체 내에 존재하는 변수 num값 반환, 0

- 22 : 같은 클래스 내의 25행에 정의되어 있는 메소드를 호출하면서 인자로 nInst가 전달, 호출된 메소드 내에서 매개변수 numb로 이를 받고 있다. 그리고 27행에서는 매개변수 numb를 이용하여 addNum 메소드 호출, -> numb가 참조하는 객체에 저장된 변수 num 값이 12증가

- 23행 : 다시 nInst가 참조하는 객체의 getNumber 메소드 호출

 

: numb가 참조하고 있는 객체 내의 변수 num를 변경한 뒤 nInst가 참조하고 있는 객체의 변수num을 출력했더니 numb를 이용하여 변화하기 전과 다른 결과가 나왔다. 즉 참조변수 numb와 nInst는 같은 메소드를 참조하고 있음 -> 메소드로의 참조변수 전달은 객체의 주소값만 전달됨.

 

* 생성되는 class 파일의 수 : 확장자가 .class인 클래스 파일은 정의되는 클래스 수 만큼 생성

 

 

 

10. 참조변수의 null 초기화

: 참조변수 선언 시 특정 개체로 초기화가 이뤄지지 않는다면 null로 초기화 가능

 

MyInst my=null;     //MyInst라는 클래스의 참조변수 my 선언

 

참조변수 my가 객체를 참조하고 있는지 확인하기 위해 다음과 같은 if문도 구성 가능

 

if(my==null) System.out.println("참조변수 my는 현재 참조하고 있는 객체가 없습니다.")

 

+) null로 초기화된 참조변수를 System.out.println메소드로 출력하면 문자열 null이 출력된다.

 

 

 

11. 사과장수 시뮬레이션

-FruitBuyer의 saleApple 메소드 : 구매를 하는데 있어서 필요하지만 클래스 안에 존재하지 않는것 -구매대상(과일장수), 구매금액(2000)

-numOfApple+=seller.saleApple(money); : seller가 참조하는 saleApple가 호출, 반환되는 값의 크기만큼 numOfApple 증가

-buyer.saleApple(seller,2000); : seller가 참조하는 객체는 사과를 판매하고 수익이 생긴다. buyer가 참조하는 객체는 돈을 지불하고 사과를 얻는다. 그 아래에 결과 출력.

 

 

 

12. 객체간의 대화방법(Message Passing방법)

 

위 시뮬레이션의 numOfApple+=seller.saleApple(money); 는 현실세계에서 " seller아저씨, 사과 2000원 어치 주세요"

'나' 라는 객체가 '과일장수'라는 객체로 부터 '과일'객체를 구매하는 행위  )

 

하나의 객체가 다른 하나의 객체에게 메세지를 전달하는 방법은 메소드 호출을 기반으로 함.

->객체지향에서 메세지 전달(Message Passing)이라고 함

 

 

 

13. 객체와 인스턴스

자바에서 객체와 인스턴스는 동일한 의미로 사용. 하지만 표현에 따라 어울리는 상황이 있음.

1) 인스턴스 : 클래스라는 틀을 기바능로 실제화 되었음을 강조할때

" 클래스 FruitSeller의 인스턴스 두 개 생성한다."

2) 객체 : 현실세계의 사물이나 대상을 프로그램상에서 표현되었음을 강조할 때

"과일장수 하시는 옆집 철수 아버님을 의미하는 객체를 생성한다."

 

+) 클래스 안에서 정의되어서, 인스턴스가 생성되어야만 접근이 가능한 변수와 메소드를 가리켜 각각 '인스턴스 변수', '인스턴스 메소드'라고 한다

 

 

* 인스턴스 변수와 인스턴스 메소드 : 메소드라는 이름이 붙은 이유는 메소드가 인스턴스의 행위 및 행동을 표현하는 방법(method)으로 사용되기 때문. 자바에서는 인스턴스 변수를 가리켜 인스턴스 필드(instance field)라고 부르기도 한다.

 

 

 

 

출처 : 난 정말 JAVA를 공부한 적이 없다구요(윤성우 저)

<1> 메소드에 대한 이해와 메소드의 정의

1.  main 메소드에 대해서 우리가 아는것 과 모르는 것


public static void main(String[] args)

{

int num1=5, num2=7;

System.out.println("5+7="+(num1+num2));

}


1) 아는 것 

-main는 메소드이다

-메소드는 클래스 내부에 존재한다

-메소드의 중괄호 내에 존재하는 문장들이 위에서 아래로 순차적으로 실행된다.


2) 모르는 것

-public, static (-> 이번 챕터에서 다루지 않는다) void 가 붙어있는 이유 

-이름이 항상 main인 이유

-메소드 옆에 있는 소괄호와 소괄호 안의 String[] args



2. 다른 이름의 메소드 만들기

* 만들어온 메소드의 이름이 항상 main 이었던 이유 : " 자바 프로그램의 시작은 main이라는 이름의 메소드를 실행하는 데서부터 시작한다."

-> 프로그램의 시작이 목적이 아니라면 얼마든지 다른 이름의 메소드를 만들 수 있다. 

1) main이 아닌 메소드정의 예시

-"hiEveryone 이라는 이름의 메소드 정의 "

-메소드 정의 : 메소드를 만드는것

-메소드 오른쪽 소괄호 : 변수선언.


2) main이 아닌 메소드실행



- 8, 9행 : 메소드 호출문 ( 메소드를 실행하는 문장) 메소드의 이름(전달한데이터); 형태. 호출된 메소드가 다 실행 되고 나서 다음줄으로 넘어간다.

- 12~16행 : 정의한 "hiEveryone" 메소드, 6,7행에서 전달한 데이터가 메소드 이름 옆에 선언된 변수 age에 전달되어 저장, 이렇게 초기화된 변수는       hiEveryone 메소드 안에서 접근 가능

-15행 : 12행에서 선언된 변수의 저장된 값 출력하는 문장 



메소드의 호출과 값의 전달 과정 : 

hiEveryone(12) 를 통해 public static void hiEveryone(int age)의 age에 12저장(hiEveryone실행) -> 저장된 값이 사용되는 문장에서 사용됨. (hiEveryone끝)다시 hiEveryone(12)로 돌아가고 다음 문장으로 넘어감. 

 

*메소드 실행에서 중요한 규칙들 

-메소드 호출문을 접하면 해당 메소드의 실행이 완료된 다음에야 비로소 그 다음 실행

-메소드는 한번 정의됨녀 여러번 실행 가능

-메소드는 메소드이름(값); 으로 호출되고 소괄호에 있는 값이 메소드 정의때 만든 변수에 저장되고 메소드 내에서 사용

-메소드가 정의되는 위치는 프로그램 실행 결과에 영향 x. (hEvery~함수가 main앞에 오든 뒤에 오든 관계 x)


3) 매개변수(parameter) : 메소드의 정의에서 매소드 이름 오른편에 등장하는 변수 

* 메소드 호출시 전달되는 값의 자료형과 매개변수의 자료형은 항상 같아야 한다

- 매개변수가 두개인 메소드와 매개변수가 존재하지 않는 메소드의 예시 

-8행 : 여러개의 값을 전달할때는 , 를 사용하여 구분한다. 

-9행 : 변수에 저장된 값도 전달이 가능하다

-10행 : 값의 전달 없이 메소드 호출

-13행 : int 변수와 double 변수가 순서대로 정의, 따라서 호출할때도 같은 순서로 값을 전달해야 한다

-20행 : 매개변수가 빈 상태로 정의. 따라서 호출할때는 값의 전달이 없어야 한다.



문제1.

Q1 두개의 정수를 전달받아서 두 수의 사칙연산 결과를 출력하는 메소드와 이 메소드를 호출하는 main메소드 정의. 단 나눗셈은 몫과 나머지 각각 출력 

* 여러개의 매개변수를 정의할때 int a,b x int a , int b o 

Q2.  두개의 정수를 전달받아서, 두 수의 차의 절대값을 계산하여 출력하는 메소드와 이 메소드를 호출하는 main 메소드를 정의해보자. 단 메소드 호출 시 전달되는 값의 순서에 상관없이 절대값이 계산되어서 출력되어야 한다.

- 내가 한것

-책에 나온 것





2. 값을 반환하는 메소드

1) 메소드 이름의 왼쪽에는 반환하는 값의 정보를 삽입하게 되어있다.  

-main앞의 void - "이 메소드는 값을 반환(메소드를 호출한 영역으로 값을 전달하지) 않는다." (5행의 main)

     -12행, 18행 : adder메소드는 int형 데이터 반환, square메소드는 double형 데이터 반환. 


2) 값의 반환 

메소드 adder

-int : 반환하는 데이터의 자료형

-return : return의 오른쪽에 등장하는 대상 반환(상수, 연산문(연산의 결과 반환), 변수) , 실행시 메소드 종료, 메소드를 호출한 영역으로 값 반환. 

-> int result = adder(4,5) -> int result = 9;  

* return addResult : add Result에 저장되어 있는 값 반환  "값의 반환은 메소드의 호출문장이 반환된 값으로 대체됨"

- 메소드는 호직 하나의 값만을 반환할 수 있음



3. 키워드 return이 지니는 두가지 의미

1) 값의 반환

2) 메소드의 종료 

-> 메소드 중간에 return문이 실행되면 메소드의 나머지 부분은 실행이 이뤄지지 않고 메소드 종료. 




* void 표시가 된 메소드 내에서 반환 목적이 아닌 오로지 메소드의 종료를 목적으로 return문 사용 가능 

-> 반환 대상 없이 그냥 키워드 return으로만 구성(반환 대상 있으면 안됨)



문제2

Q1. 원의 반지를 정보를 전달하면 원의 넓이를 계산해서 반환하는 메소드와 원의 둘레를 걔산해서 반환하는 메소드를 각각 정의하고, 이를 호출하는 메소드 정의

-내가 한 것



- 책에 나온 것





Q2. 전달된 값이 소수(prime number)인지 아닌지를 판단하여 소수인 경우 true, 소수가 아닌 경우 false를 반환하는 메소드 정의 이를 이용하여 1이상 100이하의 소수를 전부 출력할 수 있도록 main함수 정의

- 내가 한 것



- 책에 나온 것 

*1은 소수가 아님. - 결과는 내가 한 결과에서 1만 빠진다.





<2> 변수의 스코프 : 변수의  접근, 변수가 존재할 수 있는 영역

1. 가시성 (visiblity) 

* 중괄호로 영역이 형성되면 감싸이는 영역은 변수에 관한 별도의 스코프 형성


1) 동일한 이름의 변수가 여러개 선언되는 예시

: 선언된 변수가 속하는 중괄호의 영역(스코프)이 다르기 때문에 같은 이름의 변수를 여러개 선언가능. 

-10행의 num : 8행의 if에 속하는 중괄호

-16행의 num : 14행의 else에 속하는 중괄호

-25행의 num : 23행의 simple에 속하는 중괄호

*변수는 자신이 족한 중괄호 내에서만 접근 가능(선언된 이후부터) 

*for과 메소드의 매개변수는 중괄호 내에서 선언되지는 않지만 이어서 등장하는 중괄호 내에서만 접근 가능. 

( 그 영역 내에서는 같은 이름의 변수를 선언할 수 없다.)



2) 해당 영역을 벗어나면 사라진다

- 지역변수 : 중괄호 , for문 안에서 선언되는 변수와 매개변수

" 지역변수는 선언된 지역을 벗어나 버리면 메모리 공간에서 자동으로 소멸 "




<3> 메소드의 재귀호출

: 자바는 메소드의 재귀호출 지원, 자료구조와 알고리즘에서 유용하게 사용된다.


1. 수학적 측면에서 재귀적인(순환적인) 사고 - 팩토리얼의 예

1) 팩토리얼(factorial) n! : n까지의 숫자를 다 곱하는 것   


5! = 5 x 4 x 3 x 2 x 1

4! = 4 x 3 x 2 x 1

3! = 3 x 2 x 1

2! = 2 x 1

1! = 1


다르게 표현하면


5! = 5 x 4!

4! = 4 x 3!

3! = 3 x 2!

2! = 2 x 1!

1! = 1


: 재귀 - 팩토리얼의 계산식에서 다시 팩토리얼이 등장한것 . 



팩토리얼을 수학의 함수식으로 정의하면   

: f(n)={ n x f(n-1) (n>=2)  or  1 (n=1) }  (편의를 위해 0이상이 아닌 1이상으로 표현)


이와 같은 맥락으로 자바는 메소드 f의 부분에서 메소드 f의 호출문이 삽입되는 것 허용



2. 재귀적 메소드의 정의



1) 수학식과의 관계 : 

f(n) = { 1 (n=1) }  :  if (n ==1) return 1;

f(n) = { n x f(n-1) (n>=2) } : else return n*factorial(n-1);


2) 7행의 메소드 호출부터 factorial 메소드가 실제로 동작하는 방식

3) 아직 실행이 완료되지 않은 메소드를 다시 호출하는 방법 : 메모리에 저장된 메소드를 구성하는 명령문이 cpu로 이동해서 실행

 : 메소드의 앞 부분을 구성하는 명령문만 반복해서 cpu로 이동시킬 수 있다

 

 

3. 잘못된 재귀 메소드 : 종료조건의 부재

 

 

- 위 코드의 문제

(1) --cnt : 재귀호출이 일어난 다음에 cnt가 줄어들으므로 같은 매개변수를 가진 showHi가 계속 일어난다.

(2) if(cnt==1) return; : 조건검사 부분. 매개호출 아래에 들어가므로 조건검사부분이 실행되지 않는다

 

-올바르게 고친 코드

 

 

 

* 재귀 메소드 정의의 주의사항

(1) 재귀의 연결고리를 끊기 위한 조건검사의 위치가 적절해야 한다

(2) 재귀의 연결고리를 끊기 위한 조건검사가 true가 되도록 적절한 연산이 이뤄져야 한다

 

 

4. 과도한 메모리 사용

: 성능의 저하로 이어질 수 있다

1) 그럼에도 불구하고 재귀 메소드가 가진 장점

- 복잡한 문제를 간결하게 해결하는 열쇠

- 비교적 짧은 코드가 요구된다.

 

 

문제 3

Q1. 정수 N을 전달받아서 2의 N승을 반환하는 베소드를 재귀의 형태로 정의하고 이의 테스트를 위한 main 메소드도 함께 정의하자

 

 

 

* 책에서는 if (N==0) retrun 1; 로 하였다.

 

Q2. 10진수 정수를 전달받아서, 전달받은 정수에 해당하는 2진수를 출력하는 메소드를 재귀의 형태로 정의하고, 이의 테스트를 위한 main 메소드도 같이 정의하자. 참고로 아직은 다양한 출력방법을 소개하지 않았으니 여러 줄에 걸쳐서 출력이 이뤄지도록 메소드를 정의하자

 

: 나의 풀이

-binary(n) = { print(n%2) binary(n/2)  ,  1 (n이 1일 때) }  *%과 /는 java에서의 의미를 갖고있다

-2로 나눠가며 나머지 출력

-2진수를 한 줄에 나타냈을 때 맨 왼쪽에 와야하는 수를 알아보기 위해 a를 같이 출력했다.

-과정을 보기 위해 맨 왼쪽에 와야하는 수가 아닌 다른 수들의 뒤에 b와 dec을 같이 출력했다

 

=> 위에서 부터 왼쪽이 아니라 오른쪽 수가 출력. 위 아래로 순서가 바껴야 하는 경우. 나머지 출력을 재귀호출 뒤에 넣는게 좋다고 생각

 

*a와 b, dec를 지우면 코드 완성.

 

: 책에 나온 코드

 

 

차이점

- if 괄호 안 (조건검사) return의 경우/return이 아닌 경우

- 조건검사 : dec=1 , dec=0

- 메소드의 자료형 : void / int

- 변수의 사용 : 변수 x / 나머지변수 bin

-dec or decimal 의 변화 : 메소드호출 안에서 / 메소드호출 밖에서

 

 

 

'언어 > JAVA' 카테고리의 다른 글

Chapter 7. 클래스와 인스턴스 (2)  (0) 2017.05.26
Chapter7. 클래스와 인스턴스  (0) 2017.05.18
Eclipse 설치 및 실행  (0) 2017.05.11
Chapter5. 실행흐름 컨트롤(2)  (0) 2017.05.06
Chapter5. 실행흐름 컨트롤(1)  (0) 2017.05.01

<설치>

 

1.https://www.eclipse.org 홈페이지에서 Download 버튼 클릭

 



2. 64bit인 것을 확인하고 DOWNLOAD 64 BIT 클릭 



3.  Select Anther Mirror 클릭 -> Daum Kakao Corp




4.  저장 완료




4. eclipse installer -> Eclipse IDE for Java EE Developers




5. Install (중간에 나오는 Oomph 라이센스에 동의




6. 설치 후 실행




7. 오른쪽 상단의 Workbench버튼을 누르면 Welcome화면을 벗어날 수 있다.




<실행

나는 위치지정 화면에서 C:\workplace로 위치를 설정하였다.  

 

1. New - Java Project   or   New-Project-Javaproject




2. 이름설정 -> Finish



 

3. test 왼쪽 삼각형을 눌러 확장한 후 src에서 마우스 오른쪽 버튼을 눌러 New-Package (Packageclass를 기능별로 분류하는 것인데 , 나중에 소스코드가 많아졌을때 편리하다고 한다.)

 



4. Package 이름 설정. Finish

 



5. Packagetest에서 마우스 오른쪽 버튼 New-class 




6. Name를 설정하고 public static void main(String[] args 를 체크한다. Finish




7. HelloJava를 출력하는 System.out.println("HelloJava"); 작성. HelloJava.java 에서 마우스 오른쪽 버튼 - Run As - Java Application




8. 실행완료



 

 

 

 

출처 : http://pentode.tistory.com/65 

'언어 > JAVA' 카테고리의 다른 글

Chapter7. 클래스와 인스턴스  (0) 2017.05.18
Chapter 6. 메소드와 변수의 스코프  (0) 2017.05.14
Chapter5. 실행흐름 컨트롤(2)  (0) 2017.05.06
Chapter5. 실행흐름 컨트롤(1)  (0) 2017.05.01
chapter4. 연산자(Operator) (2)  (0) 2017.04.12

<3> for, while 그리고 do~while

* 반복문의 조건 : 변수선언, 조건문, 반복문을 깰 문장

 

1. while 반복문

1) 기본구조

while(조건문)

{

실행할 문장;

반복을 깰 문장;

}

** 실행할 문장과 반복을 깰 문장의 순서는 무관하다

 

 

조건확인 -> 문장실행(+변수바뀜) -> 조건확인.->문장실행 ....->조건성립x

 

 

2) 예제

 

:

num=0 (변수선언) -> while (num<5 -> 문장실행, num=1 -> num<5 ->문장실행, num=2 -> num<5 -> 문장실행, num=3 -> num<5 -> 문장실행, num=4 -> num<5 -> 문장실행, num=5 -> num <5 성립 x )  

 

 

3) 특징

-반복조건을 먼저 검사후에 반복영역의 실행여부 결정

-반복조건을 먼저 검사하기 때문에 반복영역이 한차례도 실행되지 않을 수 있다.

 

 

2. do~while 반복문

1) 기본구조

do

{

반복영역

} while(조건문);

 

반복영역 실행 -> 조건확인 -> 반복영역실행 ... ->조건성립 x -> 끝

* 반복영역을 시작할때 실행한다는 점이 while 문과의 유일한 차이점이다.

 

2) 예제

 

변수선언 (num=0) -> do while문 ( 반복영역 실행, num=1 -> num<5 -> 반복영역실행, num=2 -> num<5 -> 반복영역실행, num=3 -> num<5 -> 반복영역실행, num=4 -> num<5 -> 반복영역실행, num=5 -> 조건성립x )

 

3) 특징

-반복영역을 먼저 실행 한 다음에 반복조건을 검사한다

-반복영역을 먼저 실행하기 때문에 반복조건을 만족하지 않아도 한 차례는 실행된다.

-> 최소한 한차례의 실행이 필요한 경우 do while문 실행  

 

 

 

 

문제4

Q1. 1~99까지의 합을 구하는 프로그램 while문 이용하여 작성 

 

 

 

Q2. 1~100까지 출력하고 난 다음에, 다시 거꾸로 100에서부터 1까지 출력하는 프로그램을 작성해보자. while문과 do while문을 각각 한번씩 사용해야 한다.

 

- 내가 한 코딩

-책의 코딩

 

Q3. 1000이하의 자연수 중에서 2의 배수이면서 7의 배수인 숫자를 출력하고, 그 출력된 숫자들의 합을 구하는 프로그램을 while문을 이용하여 작성해보자.

:

 

 

 

 

 

 

3. for 반복문

 

1) while, do while문에서 따로 떨어져있던 변수선언, 조건문, 반복의 조건을 무너뜨리기 위한 연산을 한줄에 나타낸것. - 정해진 횟수의 반복을 위해 존재.

-while 문

int num=0;

while(num<5)   

{

System.out.println("...");

num++;

}

 

-for 문

for(int num=0 ; num<5 ; num++)

{

System.out.println("...");

 

2) 예제

 

3) 실행순서.

-첫번째 루프 : int i=0; -> i<3 -> 실행문장 -> i++; (변수선언 -> 조건확인 -> 실행문장 -> 변수변화) i=1

-두번째 루프 : i<3 -> 실행문장 -> i++; (조건확인 -> 실행문장 -> 변수변화) i=2

-세번째 루프 : i<3 -> 실행문장 -> i++; (조건확인 -> 실행문장 -> 변수변화) i=3

-네번째 루프 : i<3 (=거짓) 탈출!

 

*for문에서 선언되는 변수는 for문 내에서만 유효한 변수

*조건문을 제외한 영역에서 콤마를 사용해 여러 연산들을 사용할 수 있다

ex) for(int i=0, j=7; i<j ; i++,j--)

System.out.println("I love Java"+i+j);

-> 출력결과:

I love Java 07

I love Java 16

I love Java 25

I love Java 34

 

 

 

문제 5

Q1. 1부터 10까지 곱해서 그 결과를 출력하는 프로그램을 for문을 이용하여 작성하자

 

Q2. 구구단 5단을 출력하는 프로그램을 for을 이용하여 작성하자.

 

 

 

 

 

 

<4> continue & break : 반복문 내에 삽입되어 실행 흐름을 조절하는데 사용된다.

1. break문 : 가장 근접한 거리에서 자신을 감싸는 반복문을 빠져나간다.

* if 문과 함께 구성되어 특정조건이 만족될 때 반복문을 빠져나간다.

1) 예제

- 5와 7의 최소공배수를 찾는 프로그램

-5와 7의 최소공배수를 발견하면 break; 때문에 바로 while문을 빠져나간다.

-5와 7의 최소공배수가 존재하면 search는 true, if문을 실행하고 존재하지 않는다면 search는 false, else 아래의 문장을 실행한다.

 

2. continue문 : 반복문의 나머지 부분을 생략하고 프로그램의 흐름을 "조건검사 부분으로 이동" - 계속진행

*if문과 함께 유용하게 사용할 수 있다.

1) 예제 : 100이하의 자연수 중에서 5의 배수이자 7의 배수인 수를 출력하고 갯수를 세어보는 프로그램

-coutinue를 만나면 그 아래의 문장을 실행하지 않고 바로 조건검사를 진행한다

-num++<100 : 1. num<100 의 값 return 2. num++  ----조건검사와 반복문을 깨트릴 연산을 한꺼번에 넣었다.

-count 변수를 넣어 갯수를 센다

 

3. 무한루프와 break

1) 무한루프 : 조건문에 true가 명시되어 해당 반복문을 빠져나가지 못하도록 구성된 반복문

2) while 무한루프

while(true)

{

...

}

3) do while 무한루프

do

{

...

} while(true);

 

4) for 무한루프 (조건을 명시하는 부분을 비우는 유형이 더 일반적이다)

 for(;true;)

{

..

}

 

 

or

 

 

for( ; ; )

{   

...

}

 

// 조건을 명시하는 부분을 비우는 유형이 더 일반적이다

 

 

5) break문과 결합되어 사용되는 예제 : 6과 14의 최소공배수를 찾는 프로그램

: 무한루프를 이용한 이유 : 6의 배수이면서 14의 배수가 되는 수를 예측하지 않아도 되기때문. 잘못 예측한다면

 

while(num<30)

{

if(num%6==0 && num%14==0)

break;

num++;

}

 

같이 반복문을 잘못 구성할 수도 있다.

 

 

문제 6 [continue문과 break문의 활용]

Q1. ContinueBasic.java의 내부에 존재하는 while문을 for문으로 변경해서 예재를 재구현

-ContinueBasic.java

-(1) 책에서와 같은 코드

 

-(2)

 

 

 

Q2. 자연수 1부터 시작해서 모든 홀수와 3의 배수인 짝수를 더해 나간다. 그리고 그 합이 언제 (몇을 더했을 때) 1000을 넘어서는지, 그리고 1000을 넘어선 값은 얼마가 되는지 계산하여 출력하는 프로그램. 단 프로그램 내에서 반복문을 필요로 한다면 반드시 while문 무한루프로 구성.

 

-

 

 

- 중간중간 확인

 



<5> 반복문의 중첩

: 반복문은 총 9가지의 형태로 (for, while, do while 3가지 x 3가지) 중첩될 수 있다.

1. 가장 많은 for문의 중첩

1) 예제

-첫번째 for문 i 바꿔가며 3번 반복

-두번째 for문 j 바꿔가며 3번 반복


2) 구구단 만들기 예제

: 2~9단이 2~9까지 곱해지며 구구단이 이루어 진다. 단수를 바깥 for문으로, 곱해지는 수를 안의 for문으로 구성한다


* 9단은 구현되었으나 사진에는 나오지 않았다. 


2. while문의 중첩 

1) while문의 구구단

: 변수선언, 반복을 깨트릴 연산 등이 밖에 따로 있다. j=1; 이 첫번째 while문 안에 있는 것이 주목할 만 점이다.


3. 레이블을 설정하는 break문

1) 보통의 break문은 가장 가까히서 감싸는 하나의 반복문 밖에 빠져나가지 못한다.

: i와 j가 모두 짝수이면 break;을 실행하는 프로그램. 위 결과에서 break이 j에 대하여 반복하는 안쪽 코드만 빠져나간 것을 알 수 있다.


2) 빠져나갈 위치를 명시하는 break문( 레이블을 설정하는 break문)

outerloop:

for(int ~~~) 는 outerloop : for(~~~) 을 보기좋게 나타낸 것.


break outerloop; 는 outerloop라고 표시된 반복믄을 빠져나가겠다는 선언이다. 


--> 물론 다른 이름으로 표시도 가능. (원하는대로 가능하다)





문제 7

Q1. 구구단의 짝수 단(2,4,6,8단)만 출력하는 프로그램을 작성하되, 2단은 2x2까지, 4단은 4x4까지, 6단은 6x6까지, 8단은 8x8까지만 출력하도록 구현


 


- 책에서 나온 코드

Q2. 다음 식을 만족하는 모든 A와 B의 조합을 구하는 프로그램

AB

         +BA

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

99



'언어 > JAVA' 카테고리의 다른 글

Chapter 6. 메소드와 변수의 스코프  (0) 2017.05.14
Eclipse 설치 및 실행  (0) 2017.05.11
Chapter5. 실행흐름 컨트롤(1)  (0) 2017.05.01
chapter4. 연산자(Operator) (2)  (0) 2017.04.12
chpter4. 연산자(Operator)  (0) 2017.04.07

<1>  if 그리고 else

:특정 조건이 만족될 때에만 실행하고픈 문장이 있을때(if), 조건에 따라 실행하고픈 문장을 달리 하고싶을때 (else)

 

1. if 문과 if~else 문

 

1) if 뒤의 소괄호() : 안에는 true와 false 반환하는 연산식

2) 소괄호 안이 true이면 아래의 문장 실행, false면 실행 x else 가 있을 시 else 아래의 문장 실행

 

: 첫번째 if 문의 소괄호 안에 false가 들어갈 경우

 

 

 

: 두번째 if 문의 소괄호 안에 true가 들어갈 경우

 

3) if~ else 문의 실직적 활용의 예

- 소괄호 안에 연산을 넣어 true나 false를 반환하게 할 수 있다

- 실행시킬 문장이 하나라면 중괄호 생략 가능

 

 

* if ~ else 는 하나의 문장

: 자바에서 라인의 수는 결코 중요하지 않다. 한문장 - 여러라인, 여러문장 - 한라인 구성 가능. 따라서 if~ else문을 한줄에 표현해야 할 필요는 없지만 그 중간에 다른 문장이 오면 에러가 발생한다

 

2. if~else 문의 중첩과 중괄호의 생략 (else if )

: if 문 / if~else 문 내에 또다시 if문이나 if~else 문 삽입 가능.

 

1) 충접

 

: num<0 이라면 "num은 0미만"

0 <= num < 100이라면 "0이상 100미만"

100 <=num 이라면 "100이상"

 

2) 중괄호의 생략 : else if

 

-

 

- else if 문 -

 

 

 

- 중간에 else if 는 얼마든지 삽입할 수 있다. if~ else if~ else 문은 최소한 하나의 문장은 실행되는 구조. 순서대로 읽히며 조건에 해당될 때 해당 문장을 실행하고 if ~ 문을 나가므로 순서가 중요하다.

 

 

Q1 아래의 코드를 if 문 하나만 사용하는 방식으로 변경하라.

:

 

 

Q2   중첩문 예제를

num < 0 일때 "0 미만" , 0<=num<100 일때 "0이상 100미만" , 100<=num<200 일때 "100이상 200미만" , 200<=num<300 일때 "200이상 300미만" , 300<=num 일때 "300d 이상 " 을 출력하도록 예제를 변경하라

 

(중첩문 예제)

:

 

 

:

 

 

 

 

3. if~else와 유사한 조건 연산자

:피연산자가 세개인 유일한 연산자. 간단한 if~elsel문 대체하는 용도로 사용

소괄호 생략 가능, 하지만 구독성을 위해 소괄호 사용

 

 

기본구조 : true of false ? 숫자1 : 숫자2

 

?기호의 왼편에 true가 등장하면 : 기호의 왼편에 있는 숫자 반환

?기호의 왼편에 false가 등장하면 : 오른편에 있는 숫자 반환

 

 

 

Q3 위의 조건연산식 코드를 조건연산자를 사용하지 않고 if~else를 사용하는 형태로 변경해보자.

 

:

 

 

 

 

 

 

<2> switch와 break

1. switch문의 기본 구성 : switch, case, default

 

switch(n)

{

case 1:

...

...

case 2:

...

...

case 3:

...

...

default:

...

}

 

1) label (case, default) : 위치를 표시하기 위해 사용

- case 해당값: : 주어진 변수가 해당값이면 이 위치에서부터 실행

- default : : 변수에 해당하는 레이블이 없으면 이 위치에서부터 실행 ( 생략가능 )

 

 

*n, case에 주어진 값은 정수나 문자만 가능하다. case에 주어진값 상수만 가능.  

 

예제1 : n이 3일경우

 

예제2 : n이 5일경우

 

: 레이블이 지정하는 위치부터 switch의 마지막까지 실행하고 switch문 밖의 것을 실행한다.

 

 

2. switch문 + break문 : switch문의 일반적인 사용 모델

1) switch문 안에서의 break문 : switch문을 그냥 빠져나간다.

2) 레이블 안에 break을 넣게 되면 원래는 해당 레이블 부터 switch문의 끝까지 실행하던 형태에서 해당 레이블만 실행하는 구조가 된다.

 

switch(n)

{

case1:  //영역1

...

break;

case2: //영역2

...

break;

case3: //영역3

...

break;

default: //영역4 (굳이 break을 붙여줄 필요 없다)

...

}  

 

예제 : Switchbasic1 에서 case레이블 마다 break를 추가

n=2

 

n=3

: 해당하는 레이블만 실행된다.

 

 

 

3) 한줄에 둘 이상의 레이블도 붙일 수 있다 .

 

 

 

n= 1/2/3 일 경우

 

 

n=4/5일 경우

 

n이 1/2/3/4/5 외의 수일 경우

 

 

 

퀴즈 :

Q1. SwitchBreak.java를 if~else 문을 이용하는 형태로 변경해보자.

 

- SwitchBreak.java

 

 

:

 

* 안되는 경우*

n==3의 if문만 else와 짝이므로 n==3이 아닌 모든 경우에 (특히 1,2) else문이 실행된다.

 

 

Q2. 아래의 예제를 if~else문이 아닌 switch문을 활용하는 형태로 변경해보자.

 -내가 한것 :

 

 

 

 

- 책에 나온 것 :

 

'언어 > JAVA' 카테고리의 다른 글

Eclipse 설치 및 실행  (0) 2017.05.11
Chapter5. 실행흐름 컨트롤(2)  (0) 2017.05.06
chapter4. 연산자(Operator) (2)  (0) 2017.04.12
chpter4. 연산자(Operator)  (0) 2017.04.07
chapter3. 상수와 형변환(Type Casting)  (1) 2017.04.06

<1.> 자료형을 기반으로 표현이 되는 상수

1. 상수

1) 메모리공간에 저장이 된다.

2) 이름이 없다

3) 이름이 없으므로 메모리에 저장된 상수의 값을 변경시킬 수 없다.

* 연산의 대상이 되기 위해서는 메모리 공간 어딘가에 저장이 되어있어야 한다.

 

2. 상수의 저장

1) 상수는 기본자료형에 따라 데이터를 표현한다.

2) 기본적으로 모든 정수는 int(4byte) 형으로 저장된다

3) 기본적으로 모든 실수는 double(8byte)형으로 저장된다.

 

* literal(= 문자 그대로의 )(=상수) : 상수는 자료형을 기반으로 메모리공간에 저장이 되기 때문에 그 자체로 데이터로 인정한다. 그래서 나온 표현방법  

 

 

3. 접미사(-> 명시적 형변환의 일종* 실수상수를 f , 정수상수를 l로 변환할때 사용한다.  ) : ~형으로 표현해달라고 명시적 선언.

1) java는 상수의 자료형 검사에 엄격함.

-long a=10000000000; : 에러 발생. 10000000000가 int의 범위를 넘어가기 때문에. -> long a=10000000000L;

2) 변수의 자료형 크기 >= 상수의 자료형 크기 이지 않으면 compile error 가 발생한다

- float a=4.5;  : 4.5의 자료형이 double으로 8byte인데 a의 자료형은 float으로 4byte이다 -> float a=4.5f;

3) 상수의 뒤에 L/l 이나 f/F을 붙여 자료형을 바꿀 수 있다.

4) 예제 >

 

 

 

-e1 : double상수 double변수에 저장

-e2 : float상수 double변수에 저장 ( double이 8byte로 더 크기 때문에 변수와 상수의 자료형이 다르지만 에러가 나지 않는다.)

-n1 : int 범위 넘어가는 수 long상수 지정 -> long에 저장.

-n2 : int상수 long에 저장( double이 8byte로 더 크기 때문에 변수와 상수의 자료형이 다르지만 에러가 나지 않는다.)

 

 

** byte와 short형 상수 표현을 위한 접미사는 존재 x : 산술연산은 int형에서 발생하고, byte/short형 변수에 대해서는 int형상수 기반의 초기화 허용.

byte num=20;

short num=50; 가능.

 

 

 

 

<2> 자료형 변환

: 인간이 인식하기에 같은 수도 컴퓨터에서의 표현방식이 다르면 다른수로 인식된다.

1. 자료형변환의 의미 : 값의 표현방식을 바꾸는 것.

*예시 ) short형의 수를 연산할때 int 로 형변환 후 연산 하는것, 또 다시 short로 형변환 하는것

1) 종류 : 자동형변환, 명시적형변환

 

2. cpu에서의 연산

데이터는 2진수로 저장이 되는데 자료형마다 표현방식이 다르기 때문에 각 데이터들의 표현된 모습 그대로 연산을 하면 옳지 않는 값이 나온다.

따라서 자료형을 하나로 통일해 줘야 한다. (자동형변환) 

 

3. 자동형변환(implicit Conversion) : 연산의 대상이 되는 두 피연산자의 자료형이 일치하지 않아서 자동으로 발생하는 형변환

ex) double num2=3.5f+12

1) 연산에서의 자동 형변환 3.5f + 12 -> 3.5f + 12.0f

2) 데이터저장에서의 자동 형변환 12.0f -> 12.0(double)

2) 자동형변환 규칙 ( 데이터의 손실이 발생하지 않거나, 발생하더라도 손실이 제한적인 경우에만 자동형변환을 한다.)

byte -> short/char -> int -> long -> float -> double  

: 자료형의 바이트 크기가 아닌 값의 표현번위를 기준으로 정의하였다.

 

 

4. 명시적형변환(Explicit Conversion) : 명시적형변환 연산자 이용

1) 실수형상수 -> 정수형상수

int num=(int)3.15 : 소수점 이하의 데이터 손실

2) 실수형상수 -> 실수형상수 / 정수형상수 -> 정수형상수

long num1=2147483648L;

int num2=(int)num1; : 상위 바이트가 잘려나간다

.

int num3=150L;

long num4=(long)num3; : 상위 바이트가 생겨난다.

 

 

* 형변환 : 하나의 연산으로 이미 저장되어있는 값이 변하는 것이 아니라 저장된 값을 참조하여 형변환된 새로운 값을 만드는것.

 

 

 

num1 : ch1은 char형이고 num1은 int 형이다. char형은 int형으로 자동형변환이 가능하므로 ch1에 저장된 값이 형변환되어 num1에 저장된다

num2: ch2는 char형이고 num2는 int형이라서 자동형변환이 일어나는데 명시적으로 형변환 연산으로 진행하고 있다. 하지만 형변환 된다는 사실이 코드에 명시되어 있으므로 더 권장되는 코드구현이다.

 

 

 

'언어 > JAVA' 카테고리의 다른 글

chapter4. 연산자(Operator) (2)  (0) 2017.04.12
chpter4. 연산자(Operator)  (0) 2017.04.07
chapter2. 변수와 자료형  (0) 2017.04.05
chapter1 Java의 시작(2)  (0) 2017.04.04
chapter1. java의 시작(1)  (0) 2017.04.04

<2> 자바프로그램의 이해와 실행의 원리 

 1. 자바프로그램의 실행구조와 자바 가상머신. 


일반적인 프로그램의 실행구조 : 하드웨어 - Operating system - Program

-각 단계는 상호간의 통신을 하며 실행이 이루어 진다. 

-프로그램이 운영체제와 직접적인 통신을 하기 때문에 어떠한 운영체제에서 만들어진 프로그램은 다른 운영체제에서 실행되지 못한다. 

 (기능의 완성방법이 다르다. 그래픽, 키보드, 마우스 관련 기능들)


자바에서의 프로그램 실행구조 : 하드웨어 - Operating system -(운영체제에따라 달라짐)- Java Virtual Machine -(항상같음)- Java Program

- 자바 프로그램을 운영체제에 관계없이 사용할 수 있다. 

- 따라서 같은 소스코드를 Java Virtual Machine 만 다르게 하면 여러 운영체제에서 사용할 수 있다



"Java Program은 운영체제에 독립접 & Java Virtual Machine 은 운영체제에 독립적"




2. 자바컴파일러와 자바 바이트 코드 

1) 컴파일러 (javac.exe)

: 소스코드로 이루어진 소스파일(.java) (사람이 이해할 수 있는 파일) - 자바 바이트 파일(.class) (자바가상머신이 이해할수 있는 코드)

2) 자바런처 (java.exe)

:자바 바이트 파일을 자바 가상머신이 실행할 수 있도록 전달하고 인도해 주는 매개체.


 * 가상머신을 매체로 하는만큼 속도는 타 언어들보다 느리지만 큰 문제가 되진 않는다

 

 

<3>

1. java의 기본적인 형식 : class - 메소드 - 여러가지 실행들

 

2. System.out.println :

1) 기본형

 

정수 , 실수, "문자열"+정수 , 실수+"문자열", "문자열"+"문자열", 연산 이 출력 가능하다. 

*  "" 안에 있으면 문자열로 취급된다.

* +는 이전에 출력된 내용과 다음 내용을 이어서 출력한다

 

 

 

2) "문자열" + 쌍따옴표 없는 문자열이 출력 가능할까?


-> 에러. 문자열은 무조건 "" 를 붙여야 한다.

 

 

 

3) 연산과 문자열을 + 기호를 이용하여 이어서 출력할 수 있을까? 

 

 

-> 가능. 연산 결과+문자열내용 이 출력된다(/*~*/는 주석으로 complie에 참여하지 않는다)

 

* 연산이 뒤로 간다면 어떻게 될까?

 

-> 연산이 뒤로 간다면 연산 결과가 아닌 3과 5가 각자 출력된다

소스코드를 덧셈연산이 왼쪽부터 이루어져서 이러한 출력이 일어난다.

연산이 앞에 오는 경우 2+5 (=7) + "문자열" ---> 7문자열 이 되고

연산이 뒤에 오는 경우 "문자열" + 2 (=문자열2) + 5 --->문자열25이 된다. (*Q2와 관련)

 

 

 

 

3. 퀴즈

Q1. compile 했을때 생겨나는 class file 이름을 바꾸는 법 :

소스파일 내에서 입력하는 class 이름을 바꿔주면 된다.

 

 

Q2.

System.out.println("2+5="+2+5);

System.out.println("2+5="+(2+5); 를 입력하고 결과를 관찰하자

"2+5=" +2+5는 2+5=25 로 출력되었고 "2+5="+(2+5)는 2+5=7으로 출력되었다.  이는 괄호가 수학에서의 의미와 유사하게 다른 것보다 우선적으로 연산이 되기 때문이다.

 

괄호가 없는 경우: "2+5=" + 2 -> 2+5=2 + 5 의 순서로 읽혀서 2+5=25 출력

괄호가 있는 경우: (2+5) (=7) -> "2+5=" + 7 순서로 읽혀서 문자열7 출력

 

 

 

Q3 여러가지 방법으로 12 출력하기

 

 

(정수) 12

(정수) 1 + (문자열)"2"

(문자열)"" + (정수)1 + (정수)2

(문자열) "12"

(연산) 5+7

(문자열)"1" + (정수)2

(문자열)"1" + (문자열)"2"

 

 

 

<4> 컴파일의 대상에서 제외되는 주석

1. 블록단위 주석 /* ~ */

한줄도 가능하다.

 

2. 행단위 주석 // 

 

 

 

 

=> 출력되는 내용은 System.out.println 기본형과 BlockComment.java와 LineComment.java 모두 다 같다.

 

 

 

3. 퀴즈

에서 정상적으로 주석처리된 부분을 찾아내고, 처리되지 않은 부분은 또 어디인지 찾아보자.

 

 

 

 

-소스파일을 compile 했을 때 :

 

-> 18번째 줄 (*/)의 */에서 오류.  

 

 

-맨 아래의 문단을 삭제하고 compile 했을 때

 

-> 정상적으로 주석처리된 부분이 정상처리되어 compile 된다.

 

 

정상적으로 추석처리된 부분 :

1)  /* one은 1*/ : 괄호안에서 한줄 블럭주석처리 가능

2)/*
  System.out.println(2);
  //System.out.println("2");
  */

: 블럭주석 안에 행주석처리 가능

 

 

 

정상처리 되지 않은 부분 : 
 1. /*
  System.out.println(3);
  /*System.out.println("3");*/
  */

 

이유 :  같은 글자 모양으로 처리한 것들이 한 쌍인데, compile 할 때 /* 와 가장 처음 만나는 */ 가 한쌍으로 읽히므로 마지막 남은 */이 쌍이 없는것으로 판단이 되어 오류가 난다.

 

결론 : 블럭주석처리 안에 블럭주석 처리는 불가능하다.

 

 

2) /* Two는 2 */

 

실행했을 때 출력이 되는것을 보아 쌍따옴표 안의 주석은 주석처리가 안된다는 것을 알 수 있다.

 

 

'언어 > JAVA' 카테고리의 다른 글

chapter4. 연산자(Operator) (2)  (0) 2017.04.12
chpter4. 연산자(Operator)  (0) 2017.04.07
chapter3. 상수와 형변환(Type Casting)  (1) 2017.04.06
chapter2. 변수와 자료형  (0) 2017.04.05
chapter1. java의 시작(1)  (0) 2017.04.04

+ Recent posts