JAVA 2011. 6. 14. 00:44
이번에는 객체의 데이터 필드의 선언방법과 사용방법을 알아본다.

[이름]

[데이터]
반지름  --------------> 필드로 선언되야 할 부분

[기능]
면적을 구한다


이렇게 정의된 클래스를 소스로 나타내 보자.

public class Circle {
double radius;                         -------- > 필드 
Circle(double radius){
this.radius = radius;         -------- > 생성자
}
double getArea(){                    -------- > 매소드
double area;
area = radius * radius * 3.14;
return area;
}
}

이렇게 나뉘어 진다. 이런식으로 필드를 선언한다. 필드 뿐만아니라 다른 종류의 

변수들도 있다. 생성자의 radius라는 파라미터 변수, getArea 메소드안에 area라는 

로컬 변수가 있다. 이렇듯 변수는 선언 위치에 따라 변수 이름도 다르지만 사용할 수 

있는 범위도 서로 다르다.

필드의 사용 범위

파라미터 변수는 해당 생성자나 매소드 안에서만 사용 가능 하고 로컬변수는 선언 된

위치부터 매소드의 끝 또는 선언된 블록의 끝까지 사용할 수 있지만 필드는 같은

클래스 내에서라면 순서에 상관없이 생성자나 매소드 안에서 얼마든지 사용 할 수있다.

필드는 클래스 외부에서도 사용 할 수있는데 다음을 보자.

public class Cirtest {
public static void main(String args[]){
Circle obj = new Circle(0.0);
obj.radius = 5.0;
double area = obj.getArea();
System.out.println(obj.radius);
System.out.println(area);
}
}
이런식으로 필드를 선언한 클래스 외부의 다른 클래스에서도 사용가능하다.

하지만 이런식으로 외부에서 접근하는 것을 막을 수도있다.

바로 접근 제어 수식어(access control modifier) 인 private 을 쓰면된다.

필드를 선언 할 때 private double radius;  라고 선언하면 외부에서 접근을 할 수 없다.

자바에서는 이런식으로 객체의 구성요소를 외부로부터 감추는 정보 은닉(infomation hiding) 

기술을 제공하고 있는데 이 기술은 객체들이 복잡하게 얽히는 것을 방지한다.











출판사 : 한빛미디어 , 저자 : 김윤명 님의 뇌를 자극하는 Java프로그래밍에서 공부한 내용입니다.



 

'JAVA' 카테고리의 다른 글

JAVA] 20. 클래스의 정적 구성 요소  (0) 2011.06.17
JAVA] 19. 메소드  (0) 2011.06.15
자바에서의 인스턴스란?  (1) 2011.06.13
JAVA] 17. 생성자  (0) 2011.06.13
JAVA] 16. 객체와 클래스  (0) 2011.06.09
posted by 젊은쎄오
:
JAVA 2011. 6. 13. 10:53

자바에서 인스턴스라는 말이 자주나오는데 그냥 코딩을 하는데 실질적으로 

들어가는 내용이라기보다 전반적으로 알고있어야 하는 부수적인 내용이라고 

생각하고 그냥 나올때마다 아 ~ 인스턴스를 생성하는구나 하고

넘어만 가다가 오늘 아침에 문득 아니근데 인스턴스가 뭔데? 라는 의문이 들어서

검색해 보았다. 

class A {

}

클래스가 있다면 이 클래스를 사용하는 클래스에서는 

A a = new A(); 이런식으로 클래스 선언을 할 것이다.

바로 이것이 클래스를 인스턴스화 시킨 것이다.

a라는 객체를 사용하기전에 그것이 무엇인지 정의해 놓는 것이다. 이렇게 해야만

실질적으로 정의되어있는 내용을 메모리에 올려서 사용할 수 있기 때문이다.

정리 해보면 A라는 클래스를 사용하려면 A a = new A(); 라고 선언을 하지만

이는 단순히 A클래스를 a객체로 만들어 사용하기 위해서라는 이유 이 외에

메모리를 확보하고 쓸 수 있게 하는 인스턴스화 작업이 밑바탕 되어있는 것이다.


'JAVA' 카테고리의 다른 글

JAVA] 19. 메소드  (0) 2011.06.15
JAVA] 18. 필드  (0) 2011.06.14
JAVA] 17. 생성자  (0) 2011.06.13
JAVA] 16. 객체와 클래스  (0) 2011.06.09
JAVA] 15. 자바의 연산자 -2  (0) 2011.06.09
posted by 젊은쎄오
:
JAVA 2011. 6. 13. 01:03
앞에서 본 GoodsStock 클래스를 객체를 생성할 때 필드 값을 넘겨줄 수 있다면 편리할 

것 같다. 다음 방법을 보자

obj = new GoodsStock("52135" , 200);

이렇게 넘겨준 두 값이 각각 goodsCode 필드와 stockNum 필드에 각각 대입된다면 

훨씬 깔끔해 질 것이다. 

그렇다면 방법이 무엇일까?  앞서 만든 GoodsStock 클래스로는 안된다. 이럴때 

사용하는 것이 생성자이다. 생성자에 대하여 알아보자

생성자란?

대게의 경우 객체를 생성하고 나서 할 일은 객체마다 고유한 데이터 값을 필드에

저장하는 것이다. 그런일은 대게 동일한 패턴으로 이루어지기 때문에 객체를 

생성할 때 마다 동일한 로직을 계속 사용하여야 하는데 이는 비효율적이다.

그래서 자바에서는 객체가 생성되고 나서 해야 할 일을 클래스안에 써두고, 모든 객체들이

그 로직을 이용해서 초기화 작업을 할 수 있도록 만들어 두었다. 그 부분이 바로

생성자(Constructor) 라고 한다.

생성자에는 메소드처럼 파라미터를 넘겨줄 수 있다. 예를 들어 앞서 했던 

StringBuffer 객체를 생성할 때 괄호 안에 쓴 ("Hey, Java") 라는 문자열이 바로 생성자에

넘겨지는 파라미터이다. 

obj = new StringBuffer("Hey, Java");

우리가 만든 GoodsStock 클래스에도 생성자가 있다면 위에 말했듯 파라미터로 넘겨줄 수 있다.

이렇게 쓰여진 파라미터는 생성자가 호출되면 생성자의 파라미터 변수를 통해 전달된다.

그렇기 때문에, 매소드의 파라미터와 같이 받는쪽의 파라미터의 타입, 수 , 순서 와 보내는 쪽의 

타입, 수 , 순서가 맞아야 한다. GoodsStock에선 다음과 같이 되야 한다.

class GoodsStock {
String goodsCode;
int stockNum;
GoodsStock(String code, int num ){
goodsCode = code;
stockNum = num;
}
void addStock(int amount){
stockNum += amount;
}
int subtractStrock(int amount){
if(stockNum < amount)
return 0;
stockNum -= amount;
return amount;
}
}

위와 같이 클래스와 같은 이름의 생성자가 있다.

그리고 뒤에 String형 과 int 형을 받는다, 보낼 때도 이 타입과 순서를 지켜야한다. 물론 수도

생성자를 보면 메소드와 비슷한 형태이다, 하지만 생성자 특유의 특징이 있는데 그것은

생성자는 리턴타입이 없어야 하고 클래스이름과 같아야한다.

그럼 GoodsStock 클래스에 있는 생성자를 이용해 객체를 만들어보자.

public class classExample {
public static void main(String args[]){
GoodsStock obj;
obj = new GoodsStock("52135",200);
System.out.println("상품 코드" + obj.goodsCode);
System.out.println("재고 수량" + obj.stockNum);
obj.subtractStrock(201);
System.out.println("상품 코드" + obj.goodsCode);
System.out.println("재고 수량" + obj.stockNum);
}
}

이런식으로 생성자를 호출하면 코드도 한결 간결해진다. 앞서 사용했던 

obj.goodsCode="52135";
obj.stockNum = 200;

이 두 줄이 없어졌기 때문이다.

둘 이상의 생성자를 갖는 클래스
 

경우에 따라서는 한 클래스 안에 하나의 생성자만 선언하는 것으로는 충분치 않을 때가

있다. 예를 들어 인터넷 사이트의 가입자 정보를 표현하는 다음과 같은 클래스를 선언해야

한다고 가정해보자.

[이름]
가입자 정보 클래스

[데이터]
이름
아이디
패스워드
전화번호
주소

[기능]
패스워드를 바꾼다
전화번호를 등록한다
주소를 등록한다


그런데 어떤 가입자는 이름, 아이디, 패스워드만 입력하고, 어떤 가입자는 전화번호와 주소까지

입력한다면, 어떤생성자를 만들어야 할까? 5개를 다 받는 생성자를 만들어야할지,, 고민된다.

방법은 그 두 상황의 생성자를 만들어 놓으면 된다.

class SubscriberInfo {
String name, id, password;
String phoneNo, address;
SubscriberInfo(String name, String id, String password){
this.name = name;
this.id = id;
this.password = password;
}
SubscriberInfo(String name, String id, String password, 
String phoneNo, String address){
this.name = name;
this.id = id;
this.password = password;
this.phoneNo = phoneNo;
this.address = address;
}
void changePassword(String password){
this.password = password;
}
void setPhoneNo(String phoneNo){
this.phoneNo = phoneNo;
}
void setAddress(String address){
this.address = address;
}
}

소스를 보면 첫번째 생성자는 파라미터를 이름, 아이디, 패스워드 이렇게 세개를 받는다.

각각 파라미터로 넘어오는 족족 필드에 파라미터를 넣어주고있다.

필드 앞에 this. 를 붙이는 이유는 파라미터 변수와 필드명이 같을 때 필드이름 앞에

this를 붙여 구분을 주는 것이다
. 필드명과 파라미터명이 다르면 필요없다.

두번째 생성자는 이름, 아이디, 비밀번호, 전화번호, 주소 모두를 받고 있다. 

이제 객체를 생성하는 소스를 보자.

public class constrExam {
public static void main(String args[]){
SubscriberInfo obj1, obj2;
obj1 = new SubscriberInfo("포스팅잉여", "fool", "1234");
obj2 = new SubscriberInfo("졸려라", "gotosleep", "1234", "010-3104-xxxx", "경기도 의정                                                       부시 의정부동 푸르미텔 20x호..");
printSubscriberInfo(obj1);
printSubscriberInfo(obj2);
}

static void printSubscriberInfo(SubscriberInfo obj) {
System.out.println("이름 : " + obj.name);
System.out.println("아이디 : " + obj.id);
System.out.println("비밀번호 : " + obj.password);
System.out.println("전화번호 : " + obj.phoneNo);
System.out.println("주소 : " + obj.address);
System.out.println();
}
}

먼저 클래스를 선언하는데 두가지 생성자를 호출하기 때문에 클래스 객체도 두개를 써준다.

obj1 엔 이름, 아이디, 비밀번호를 obj2 엔 이름, 아이디, 비밀번호, 전화번호, 주소 모두를 

넘겨준다. 이렇게 하고 실행을 하면 SubscriberInfo클래스의 필드에 파라미터로 넘어가는

데이터가 차곡차곡 들어갈 것이다. 그러고 printSubscriberInfo 라는 메소드를 만들어

각각 출력 하게 했다. printSubscriberInfo에 파라미터로 클래스 객체를 넘겨서 우선 

obj1 과 obj2 를 new SubscriberInfo 해서 데이터를 넣고 printSubscriberInfo에 

obj1, obj2 를 파라미터로 넘긴다면 그 안에 들어간 데이터들이 쭉 찍혀 나올 것이다. 

나는 초보자라 매소드하나 만드는게 큰맘먹고 생각 많이 해서 만들어야 할 정도로 

복잡하고 어려운 것이 었는데 이 책에선 단지 출력값 뿌리는데에 사용하고있다.. 

대단한것 같다.. 아직 멀었나보다. 

각설하고 이 프로그램을 실행 시키면 뭐가나오는지 보자.

이름 : 포스팅잉여
아이디 : fool
비밀번호 : 1234
전화번호 : null
주소 : null

이름 : 졸려라
아이디 : gotosleep
비밀번호 : 1234
전화번호 : 010-3104-xxxx
주소 : 경기도 의정부시 의정부동 푸르미텔 20x호..


이런식으로 깔끔하게 예제가 수행된다. 위에 null이란 것은 String 필드에 아무것도

데이터가 들어있지않음을 표시하는 것이다. 위 예제에서 첫번째 생성자는 전화번호와

주소를 넘기지 않았기 때문에 출력할 데이터가 없어서 null이 들어온 것이다.

참고로 int 형에는 0 , 불리언 타입에는 false, 그 밖의 타입은 null로 데이터없음을

표현한다.

생성자의 구분 방법 

앞서 설명 했듯 생성자는 파라미터 변수의 수, 타입, 순서로 구분된다. 

하지만 파라미터 변수의 이름은 구분의 기준이 되지 않는다. 그렇기 때문에 다음 두 생성자는

잘못 된것이다.

SubscriberInfo(String name, String id, String password){
this.name = name;
this.id = id;
this.password = password;
}
SubscriberInfo(String name, String id, String address){
this.name = name;
this.id = id;
this.address = address;
}

두 생성자가 있다. 하나는 이름, 아이디, 비밀번호를 다른하나는 이름, 아이디, 주소를 

파라미터로 넘겨주고 있다. 이렇게 보면 두 생성자는 다른 것이라고 우린 알 수 있지만

컴퓨터가 구분 할 수는 없다. 우선 앞서 말했듯 생성자이름은 구분의 기준이 되지않고

파라미터로 넘어가는 데이터 또한 두 생성자 모두 전부 String 형에 파라미터 수도 같기 

때문이다. 이런식으로 생성자 선언을 하면 오류가난다. 잘못된 방법이다.

디폴트 생성자

앞에서 생성자를 선언해서 파라미터를 넘겨주는 방법을 배웠다. 하지만 생성자는 잘만들어놓고

정작 파라미터없이 실행을 하면 어떻게 될까? 답은 컴파일 오류이다. 그렇기 때문에 값이 없을 때를

대비하여 만들어 놓는 생성자가 디폴트 생성자 일명 , no-arg constructor 이다. 

이 놈을 추가해 주면 파라미터 없이 수행을 해도 컴파일 오류가 나지 않는다.

SubscriberInfo(){
}
SubscriberInfo(String name, String id, String password){
this.name = name;
this.id = id;
this.password = password;
}
이런 식이다. 생성자를 하나더 만드는데 안에 받는 파라미터 없이 빈 괄호만 써준다. 넘어오는 것이

없으니 안에서 수행 할 것도 없다. 그냥 중괄호도 닫아준다. 그러고 실행을 하면 

이름 : null
아이디 : null
비밀번호 : null
전화번호 : null
주소 : null

오류 없이 데이터가 없다 라고 뿌려준다. 

전에 포스팅 했던 16 번 객체와 클래스 편을 봤다면 거기나온 GoodsStock 클래스는 생성자가

없었는데 파라미터없이 객체를 생성해도 컴파일 오류가 안났었다. 그 이유는 GoodsStock 에는

생성자가 아예 하나도 없었기 때문이다. 그럼 자바 컴파일러는 위에 방금 만들어본

디폴트 생성자를 하나 추가해서 오류없이 돌려준다. 하는 일은 없다 다만 오류를 안나게 하는거?

근데 위  SubscriberInfo는 생성자가 두개나 있었기에 자동으로 디폴트 생성자가 만들어지지 

않았던 것이다.

생성자에서 생성자 호출하기 

앞에서 보는듯 생성자가 하는일은 비슷비슷하다. 이럴때 똑같은 생성자 호출문을 두번씩 

쓰기보다 생성자에서 생성자를 호출하는 방법을 사용하는 것이 더 좋다. 

this(name,id,password);

이렇게 생성자 안에서 다른 생성자를 호출하면 같은 클래스에 있는 생성자 중에서 파라미터의

수, 타입, 순서가 맞는 생성자가 호출된다. 

SubscriberInfo(String name, String id, String password){
this.name = name;
this.id = id;
this.password = password;
}
SubscriberInfo(String name, String id, String password, 
String phoneNo, String address){
this(name, id, password);
this.phoneNo = phoneNo;
this.address = address;
}

이렇게 두번째 생성자가 첫번째 생성자를 호출하여 그 안의 데이터를 쓴다. 한가지 주의할 점은

저 구문은 반드시 생성자의 첫번째 명령문이어야 한다. 맨 위에 있어야 한다는 것이다.

저게 두번째 줄만 되도 오류가 나버린다. 

생성자편을 하면서 배우는 것이 많았다. 생성자.. 맨날 초기값을 셋팅해주는 놈으로 개념만 대충

알고 써먹지를 못하는 놈이었는데 이번기회로 .. 솔직히 지금도 내 프로젝트에 어떻게 써야할지 

좀 생각해봐야겠지만 아무튼. 생성자도 자주 접해서 익혀야 된다 . 그리고 아까 그 단순한 

출력 부분을 메소드화로 전체적인 코드가 깔끔해지는거.. 이런거 배우고 싶다 . 나같으면 아마

obj1.name , obj2.name 이러고 일일히 1,2, 안에 모든 파라미터를 한줄한줄 출력했을 것이다..

재밌다 그래도 




  출판사 : 한빛미디어 , 저자 : 김윤명 님의 뇌를 자극하는 Java프로그래밍에서 공부한 내용입니다.

'JAVA' 카테고리의 다른 글

JAVA] 18. 필드  (0) 2011.06.14
자바에서의 인스턴스란?  (1) 2011.06.13
JAVA] 16. 객체와 클래스  (0) 2011.06.09
JAVA] 15. 자바의 연산자 -2  (0) 2011.06.09
JAVA] 14. 자바의 연산자 -1  (0) 2011.06.08
posted by 젊은쎄오
:
JAVA 2011. 6. 9. 23:26
객체의 생성하는 방법

객체를 생성하기 위해서는 자바의 new 연산자를 사용해야 한다.

객체를 생성하는 식의 제일 앞에 new 를 쓰고 다음에 클래스이름, 그다음에 (데이터값)을

써야한다. StringBuffer 클래스는 객체를 생성할 때 문자열을 필요로 하니 다음과 같이 

문자열을 써넣어야 한다.

new StringBuffuer("Hey, Java")

하지만 이렇게 객체를 생성하는 식만가지고 명령문을 만들어서는 소용이 없고 자바에서는

객체도 데이터로 취급하기 때문에 변수에 대입한다.

obj =  new StringBuffuer("Hey, Java")

저 클래스를 담은 변수는 뭘까? int 나 byte 는 당연히 아닐 거고 바로 클래스 이름이다.

클래스의 이름인 동시에 클래스를 담는 변수의 타입이 된다. 

StringBuffuer obj =  new StringBuffuer("Hey, Java")

이렇게 말이다. 

객체의 기능을 사용하는 방법

앞서 말한것 중에 StringBuffer는 문자열을 조작할 수 있다고 했다. 일단 이 클래스가 어떤

기능을 제공하는지 찾아보자 (기능보러가기)

가운데 쯤 보면 Method Summary 라는 제목이 쓰여진 부분이 있는데 이 부분이 클래스의 

기능이 쓰여있는 부분이다. 

이 중에 deleteCharAt 매소드와 insert 매소드를 알아 볼 것인데 deleteCharAt 매소드는 

문자열의 특정 위치에 있는 문자 하나를 삭제하는 매소드이고, insert 매소드는 

int 와 char 타입의 파라미터를 하나씩 받는 insert매소드를 사용 할 것이고 기능은

문자열의 특정위치에 문자하나를 삽입하는 것이다.

이제 호출을 해야하는데 호출 방법은 매소드 이름 앞에 그 객체를 담고 있는 변수이름(obj)와

마침표(.) 를 써주어야 한다.

obj.deleteCharAt(1);
obj.insert(1,'i');

위 deleteCharAt 매소드의 1은 문자열에서 두번째 문자를 가리킨다, 이유는  왼쪽으로 시작하여

0부터 세어지기 때문이다, deleteCharAt 매소드에 1이라는 값을 넘기면 "Hey, Java"에서 

e가 지워진다, 두번째 문자열을 지우라는 매소드 이기 때문이다. 여기서 한번더 호출하면

y 마저 지워지고 "H, Java"만 남는다. 여기서 insert(1,'i')를 보면 우선 첫번째 파라미터의 1은

deleteCharAt 매소드와 같이 두번째 문자열자리를 가리키는 것이고 두번째 파라미터의 'i'는 

그 두번째 문자열자리에 i 를 넣으라는 것이다 . 그럼 H다음에 i가 들어가서

"Hi, Java" 가 찍힐 것이다. 

class objExam {
public static void main(String args[]){
StringBuffer obj;
obj = new StringBuffer("Hey, Java");
obj.deleteCharAt(1);
obj.deleteCharAt(1);
obj.insert(1,'i');
System.out.println(obj);
}
}
위 소스 이다. 돌려보면 정말 Hi, Java 가 찍힌다.


클래스 선언의 기초 문법

클래스를 선언하는 방법이다. 쇼핑몰의 재고관리 프로그램을 작성한다고 가정하자. 

[이름] 상품 재고 클래스    ---->  GoodsStock        클래스 이름은 대문자로 시작.
[데이터]
상품코드                         ---->  goodsCode         필드 이름은 소문자로 시작.
재고수량                         ---->  stockNum
[기능]
재고를 더한다                  ---->  addStock            메소드이름은 소문자로시 작하는 동사.
재고를 뺀다                     ---->  subtrackStock

이런식으로 이름들을 정했으면 그 다음에는 필드의 타입과 메소드의 파라미터 변수타입,

리턴 타입을 정해야 한다. 그렇게 하고 클래스를 선언한 것을 보자.

class GoodsStock {
String goodsCode;
int stockNum;
void addStock(int amount){
stockNum += amount;
}
int subtractStrock(int amount){
if(stockNum < amount)
return 0;
stockNum -= amount;
return amount;
}
}

이런 식이 된다. 보면 알수 있듯 객체를 만드는데 사용할 클래스도 지금까지 보았던 

main 매소드를 포함하는 클래스처럼 제일 앞에 class 키워드를 써줘야 한다.

String 타입의 goodsCode와 int 타입의 stockNum  이 있다. 

재고를 더한다에 해당하는 void addStock 매소드와 뺀다에 해당하는 substractStock이 

있는데 둘다 정수이기 때문에 int 형의 파라미터를 받고 addStock에 void가 붙는 이유는

앞서 말했듯 리턴값이 없어서 정도로 알아 두면 된다.

직접 선언한 클래스를 사용하는 프로그램의 작성 방법

앞에서 보았던 StringBuffer 클래스를 호출 할 때와 별반 다르지않다. 

변수를 만들고 담으면 된다.

obj = new GoodsStock(); 

이렇게 써준다. 이제 goodsCode와 stockNum 필드에 값을 대입해야 한다.

obj.goodsCode = "52135";
obj.stockNum = 200;

필드에 값을 대입 했으면 매소드를 호출해 본다.

obj.addStock(1000);

public class classExample {
public static void main(String args[]){
GoodsStock obj;
obj = new GoodsStock();
obj.goodsCode="52135";
obj.stockNum = 200;
System.out.println("상품 코드  :" + obj.goodsCode);
System.out.println("재고 수량  :" + obj.stockNum);
obj.addStock(1000);
System.out.println("상품 코드  :" + obj.goodsCode);
System.out.println("재고 수량  :" + obj.stockNum);
}
}

최종 소스이다. 이 소스가 아까그 클래스를 사용하여 결과값을 출력 하는 것이다.

상품 코드  :52135
재고 수량  :200
상품 코드  :52135
재고 수량  :1200

이런식의 결과값이 나온다.

이렇게해서 이 절에서는 클래스를 선언하고, 그 클래스를 이용해서 객체를 생성하고 사용하는

간단한 예제를 짜보았다. 

자바에서는 기초였지만 난 아직도 헷갈리는 부분이 있고, 아 이게 그런거였구나 .. 하는 

부분이 많았던 포스팅이다.. 기초가 부족하다기 보다 없다는얘기 -_-..










출판사 : 한빛미디어 , 저자 : 김윤명 님의 뇌를 자극하는 Java프로그래밍에서 공부한 내용입니다.
 

'JAVA' 카테고리의 다른 글

자바에서의 인스턴스란?  (1) 2011.06.13
JAVA] 17. 생성자  (0) 2011.06.13
JAVA] 15. 자바의 연산자 -2  (0) 2011.06.09
JAVA] 14. 자바의 연산자 -1  (0) 2011.06.08
JAVA] 13. 자바의 타입 분류 체계와 프리미티브 타입  (0) 2011.06.07
posted by 젊은쎄오
:
JAVA 2011. 6. 9. 00:51
어제에 이어서 자바의 연산자에 대하여 계속 한다.

논리 연산자 & | ^ !

앞에서 배운 수치 비교 연산자와 동등 연산자는 모두 두 값을 비교한 결과를 boolean 값으로

산출한다. 그런데 때로는 이런 결과들을 조합하여 좀더 복잡한 논리식을 만들어야 할

경우도 있는데 그 때 사용하는 연산자가 논리 연산자이다.

피연산자1 & 피연산자2               >  1과 2가 모두 같으면 true, 그렇지 않으면 false이다.
피연산자1 | 피연산자2               >  1과 2가 모두 false면 false, 그렇지 않으면 true이다.
피연산자1 ^ 피연산자2               >  하나가 true, 하나가 false면 true, 그렇지 않으면 false이다.
!피연산자1                               >  값이 true이면 false, false이면 true.

복잡하고 헷갈린다,, 

조건 AND / OR 연산자 && ||

&&, || 는 위에서 배웠던 것과 같은 연산을 수행한다.

피연산자1 && 피연산자2            >   두 값이 모두 true면 true, 그렇지 않으면 false이다.
피연산자1 || 피연산자2            >   두 값이 모두 false면 false, 그렇지 않으면 true이다.


보면 위 &, | 와 다를게 없어 보인다, 하지만 차이점이있는데 보자

우선  ( 1 > 2 )  &  ( 3 < 4 ) 라면 어떤 방식으로 계산할까?

컴퓨터는 우선 양쪽 피연산자를 먼저 계산한다. ( 1>2)를 계산하여 false를 얻고

(3<4) 를 계산하여 true를 얻는다 ,그러고 최종적으로 false를 얻는다.

하지만 사람이 푼다면 처음에 (1>2) 를 보고 ' 아 false네 뒤엣건 보나마나 아차피

false겠구나' 하고 바로 결과에 도달한다. 바로 이런게 && , || 이다 .

얘네는 사람처럼 앞에만 계산하고 결과를 얻을 수 있다.

조건연산자 ? :

if 문이 조건에 따라 다른 명령을 실행하는 조건문이라면 ? : 이것은 조건에 따라 

다른식을 계산 하는 조건 연산자이다. 형식을 보자

조건식 ? 식1 : 식2           > 조건식이 true이면 식1을 계산하고 그렇지않으면 식2 를 계산한다

예 ) a < b ? a + 1 : b * 2 이런식이다, 

비트 연산자 & | ^ ~

&, |, ^, ~ 는 데이터가 표현하는 값이 아니라 데이터를 구성하는 비트 자체를 가지고

AND, OR, XOR, NOT 연산을 수행하는 연산자이다.

피연산자1  &  피연산자2           >   두 데이터의 같은 위치 비트들을 AND 연산한다.
피연산자1  |  피연산자2           >   두 데이터의 같은 위치 비트들을 OR 연산한다.
피연산자1  ^  피연산자2           >   두 데이터의 같은 위치 비트들을 XOR 연산한다.
~피연산자1                             >   데이터의 각 위치 비트들을 NOT 연산한다.


정보처리 딸 때 공부했던 기억이.... 했던 기억만...-_-

쉬프트 연산자 <<    >>    >>>

정수 << 비트수       >    정수를 구성하는 비트를 주어진 비트수만큼 왼쪽으로 이동하고 
                                  빈 공간은 0 으로 채움
정수 >> 비트수       >    정수를 구성하는 비트를 주어진 비트수만큼 오른쪽으로 이동하고 
                                  빈 공간은 MSB와같은 비트로 채움
정수  >>>  비트수   >    정수를 구성하는 비트를 주어진 비트수만큼 오른으로 이동하고 
                                  빈 공간은 0 으로 채움


음,, 이것도 본기억이 .. 밀리고 0 채우고 이런거.. 많이 봤는데 -ㅅ-

캐스트 연산자

캐스트 연산자는 타입의 변환을 전문적으로 수행하는 연산자이다. 

(타입) 피연산자      >   피연산자의 값을 타입으로 변환한다.

(int)num , (byte)12.5 등등..

캐스트 연산자는 피연산자를 변환시키는 것이 아니라 새로운 타입으로 값을 만들어 내는것이다.

int num1 = 3;
double num2 = (double)num1; 

위를 보면 num1을 바꾸는 것 처럼 보여도 결과적으로 num2를 만들어 내는 것이다. 

값이 옮겨 간 것일 뿐..

자바 연산자에는 우선순위가 있다. 수학 처럼 .. 물론 낮은 수준의 수학-_-.. 그 수학처럼 

사칙연산만 정도의 갯수만 나온다면 구분을 하지만 자바처럼 많은 연산이 동시에 수행되려면

정해진 순서가 필요했고 아래와 같다.



이 순서로 진행된다. 

안드로이드 하면서 몰랐던 연산도 많이 봤다. 갈길이 멀다 

 





출판사 : 한빛미디어 , 저자 : 김윤명 님의 뇌를 자극하는 Java프로그래밍에서 공부한 내용입니다. 
posted by 젊은쎄오
:
JAVA 2011. 6. 8. 01:34
정해진 규칙에 따라 데이터를 처리하여 결과를 산출하는 것을 연산(operation)이라 한다.

그리고 연산에서 쓰는 표시나 기호들을 연산자(operator)라고 한다. 연산자가 처리하는 

데이터는 피연산자(operand)라고 하고 연산자와 피연산자를 이용하여 연산의 과정을

기술한 것을 연산식 또는 간단하게 식(expression) 이라고 부른다.

자바는 +.-.*,/ 와 같은 사칙 연산자 외에 조건식을 만드는데 사용되는 비교연산자와 

변수에 값을 대입하는 대입 연산자도 있다. 연산자들의 기능은 데이터 값 뿐만 아니라

데이터 타입과도 밀접한 관련이 있는데, int 형 + int 형이라면 값도 int 형이라야 

한다는 것이다, 만약 int 1과 double 0.5 를 더한다면 int 1을 double 1.0 으로 타입을 맞춘뒤에

연산을 해야 한다. 그럼 double 타입 + double 타입 이 되고 결과 값도 double로 쓰면 된다.

이제 연산자의 종류와 사용법에 대해 알아보자

사칙 연산자 + - * / % 

피연산자1 + 피연산자2      - 1과 2를 더한다.
피연산자1 - 피연산자2      - 1에서 2를 뺀다.
피연산자1 * 피연산자2      - 1과 2를 곱한다.
피연산자1 / 피연산자2      - 1을 2로 나눈 몫을 구한다.
피연산자1 % 피연산자2     - 1을 2로 나눈 나머지를 구한다.


알고 가야 할 부분이 있는데, / 와 % 이 이다. / 는 둘을 나누고 나온 몫을 구하는 연산자인데 

두 피연산자가 둘다 정수면 몫도 정수로 구하지만 둘 중에 하나라도 부동소수점 타입이면 

소수점 아래 까지 계산한다. 

7 / 2    >>  둘다 정수면 결과는 3이 나온다

하지만 

7.0 / 2 또는 7 / 2.0 , 7.0 / 2.0 등과 같이 둘중 하나라도 부동소수점 타입이라면

결과는 소수점 아래자리 까지 구한 3.5 가 나온다.

% 는 피연산자가 정수 타입이든 부동소수점 타입이든 상관없이 몫을 정수로 산출하고 

남은 나머지를 계산한다.

7 % 2    >>  결과는 1
7.5 % 2.0  >>  결과는 1.5

연산이 많으면 우선 순위가 있는데 수학에서 배운 규칙을 따른다, 덧셈, 뺄셈 보다 

곱셈, 나눗셈이 우선이고 제일 왼쪽에 있는 연산자부터 순서대로 처리된다.

부호 연산자 + -

+ 와 - 는 사칙 연산자이면서 부호연산자인데 부호연산자일 경우에는 하나의 피연산자만

취하기 때문에 구분 할 수있다.

+ 피연산자    - 피연산자의 부호를 그대로 둔다.
- 피연산자    - 피연산자의 부호가 + 면 - 로 -면 +로 바꾼다.


부호 연산자를 사용할 경우 주의할 점이 있는데 피연산자의 타입이 byte, short, char 이면 

연산을 하기전에 전부 int 로 바꿔줘야 한다.   

문자열 연결 연산자 + 

문자열 연결 연산자 + 는 두 개의 문자열을 연결해서 새로운 문자열을 만드는 연산자이다.

문자열1 + 문자열2     - 문자열1 뒤에 문자열2를 연결한다  예) "Hello, "  +  "Java"  
문자열 + 비문자 데이터   - 문자열뒤에 데이터를 넣는다 예) "sum = " + 30


문자열 연결 연산자를 사용하다보면 간혹 헷갈리는 때가 오는데 바로

"sum = " + 3 + 4   와 같은 경우이다. 식을 보면 두번째 + 는 문자열 연결 연산자인지 

사칙연산자의 + 인지 헷갈린다, 이런경우는 무조건 왼쪽부터 연산이 된다고 생각하면된다.

그럼 먼저 sum = 3 이 되고  뒤에 + 4 가 있기 때문에 sum = 34 라는 값이 찍힌다. 

반대로 3 + 4 + " = sum" 이라면 3+4 가 먼저 되어 7이 되고 뒤에 = sum 이 붙어 7=sum이다.

단순 대입 연산자 = 

= 연산자는 단순히 오른족의 식의 결과를 왼쪽에 대입 시키는 연산자이다. 

변수 = 식     -  오른쪽의 식의 결과를 왼쪽 변수에 대입한다.

앞서 포스팅한 변수 부분에서 말했듯 대입에서 주의할 점은 바로 타입이다. 

좌변의 타입과 우변의 타입을 맞춘 상태에서 대입을 해야한다. int i = 2.5 이런식으로 

부동소수점 타입을 정수 타입에 넣으려 하면 안된다는 소리이다.

대입 연산자는 다른 연산과 다르게 오른쪽부터 연산이 시작되는걸 알아두자.

증가 연산자와 감소 연산자 ++ -- 

++ 는 변수의 값에 1을 더한 결과를 다시 값에 넣는 것이고, -- 는 변수의 값에서

1을 뺀 결과를 다시 변수에 담는 연산을 한다.

변수 ++ , ++ 변수       - 변수의 값에 1을 더하고 다시 변수에 담는다.
변수 -- , -- 변수       - 변수의 값에 1을 빼고 다시 변수에 담는다.


++, -- 연산자가 변수뒤에 붙으면 변수의 기존 값이 결과 값이 되고, 

변수 앞에 붙으면 변수의 새로운 값이 결과 값이 된다.


class Test {
public static void main(String args[]){
int num1 = 0, num2 = 0, num3 = 0, num4 = 0;
int result1 = num1++;
int result2 = num2--;
int result3 = ++num3;
int result4 = --num4;
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
System.out.println(result4);
}
}
다음과 같은 예제를 컴파일하면 

0
0
1
-1
과 같은 결과가 나온다, num1 과 num2 는 ++,-- 연산자가 뒤에 붙었으므로 기존의 값이

출력되고 num3과 num4 같이 ++, -- 연산자가 앞에 붙으면 바뀐 새 값이 출력 된다. 

수치 비교 연산자 < > <= >=

< , > , <= , >= 는 두 수의 크기를 비교하는 수치 비교 연산자입니다. 

피연산자1 < 피연산자2      -  1값이 2값보다 작으면 true, 크면 false이다.
피연산자1 > 피연산자2      -  1값이 2값보다 크면 true, 작으면 false이다.
피연산자1 <= 피연산자2      -  1값이 2값보다 작거나 같으면 true, 그렇지않으면 false이다.
피연산자1 >= 피연산자2      -  1값이 2값보다 크거나 같으면 true, 그렇지않으면 false이다.

주로 이런 비교 연산자는 if 나 while 문 같은 조건식에 많이 쓰인다.

동등 연산자 == !=

==과 !=은  두 데이터의 값이 같은지 다른지를 판단하는 연산자이다. 

피연산자1 == 피연산자2          - 1과 2가 같으면 true, 다르면 false이다.
피연산자1 != 피연산자2          - 1과 2가 다르면 true, 같으면 false이다
.

동등 연산자도 수치 비교연산자와 같이 조건문에 많이 쓰인다. 

한 가지 주의할 점이 있는데

double num1 = 1.1 + 2.2 
double num2 = 3.3  이라 했을 때

num1 == num2 가 false가 된다. 이는 부동소수점 수를 자바 내부 표현으로 바꾸고 더하는

과정에서 미세한 차이로 오차가 발생 했기 때문이다. 자바는 마지막 한 비트 까지

비교하기 때문에 위와 같은 결과가 나온다. 


연산자 진짜 많다. 나는 이렇게 개념 잡고 시작한게 아니라 소스보면서 알아 간거라 

별거 없어보였는데 풀어서 나열하니 꽤나 많다. 앞으로 이 것 만큼 더 남았다. 

이걸 모르고 소스부터 봤으니 -_- ... 답이없...었다
 






출판사 : 한빛미디어 , 저자 : 김윤명 님의 뇌를 자극하는 Java프로그래밍에서 공부한 내용입니다.
posted by 젊은쎄오
:
JAVA 2011. 6. 7. 23:13
자바에서 변수는 선언될 때부터 타입이 정해진다는 것은 앞에서 얘기 하였다. 그런데 자바에서는 

변수에 담기는 데이터들도 각각 타입이있다. 뿐만아니라 변수에 담기기 전의 데이터에도 타입이있고

데이터 연산의 중간 결과로 산출되는 데이터 값에도 타입이 있다.

자바에서는 변수와 변수에 담기는 데이터의 타입이 같지않으면 오류가 나거나 데이터가 손실된다.

그렇게 되면 자바는 전혀 엉뚱한 결과를 뱉어내기 때문에 잘 알아둬야 한다.

자바 데이터 타입의 분류 체계

자바 데이터는 크게 프리미티브 타입과 래퍼런스 타입으로 구분된다.


위 표와 같이, 프리미티브 타입이란 자바 키워드로 등록되어있는 byte, short, long, char, float,

double, boolean 타입을 말한다. 

프리미티브 타입을 제외한 나머지 타입을 래퍼런스 타입(reference type) 이라 하고

래퍼런스타입은 모두 프리미티브타입을 기초로 만들어진다. 

래퍼런스 타입은 객체에 관련된 것 들이니 나중으로 미루고 일단 프리미타입을 보자.

정수 타입에 대하여 

정수 타입에 속하는 byte, short, int, long 타입은 수학에서의 말하는 정수 타입이다. 

타입이 나눠진 이유는 각각 메모리의 양과 관련있고 , 메모리 양으로 크고 작은 범위의 

정수를 표현한다. 


더 넓은 범위의 정수를 표현
>>>>>>>>>>>>>>>>>>
byte > short > int > long 
<<<<<<<<<<<<<<<<<<
더 적은 메모리를 사용



위의 표를 다시보면 문자를 표현하는 char 타입도 정수타입으로 분류되어 있는것을 볼 수 있다.

이유는 문자 데이터가 프로그램 내부에서 글자의 모양이 아니라 문자를 대표하는 코드 값으로 

표현되는데,  그 코드 값이 바로 정수라서 이다. 자바에서 사용하는 문자 코드 체계는 

Unicode 인데 이 Unicode 에는 한글을 비롯한 한자, 영문, 아랍 문자등 세계 각국의 문자들이 

코드 값으로 정의되어있고 이는 0 ~ 65535 까지의 정수에 속하기 때문에 이 것을 나타내는

char 타입도 0 ~ 65535 까지의 정수를 담은 타입인 것이다.

부동 소수점 타입에 대하여

부동소수점이란 일종의 소수 표기 방법을 말한다. 

더 넓은 범위의 수를
더 정확한 수로 표현
>>>>>>>>>>>>>>>>>>
float > double
<<<<<<<<<<<<<<<<<<
더 적은 메모리를 사용
 
불리언 타입에 대하여

boolean 타입은 참과 거짓을 표현하는 타입이다. 이 변수를 사용한 적은 없지만,

if 문을 봐도 if(num > 10)  이런 조건식의 결과는 boolean 타입을 갖게된다. 이 식이 참일 때만 

수행하라, 라는 것이니 참과 거짓을 표현한다고 할 수 있기 때문이다. 이 자리에

if (true) 라고 써도 무방하다. 

class BooleanTest {
public static void main(String args[]){
int num = 10+ 20;
boolean truth;
truth = num > 10;
if (truth)
System.out.println("계산 결과가 10 보다 큽니다");
}
}

위의 예제를 보면 boolean 을 변수로 선언하여 값을 얻었다. 해당 대입값의 참 , 거짓을 

판별 하여 그 결과를 boolean 변수에 담고 if 문 식에 넣어 그 결과가 참이라면 아래 식을 

수행하게 하였다. num 은 30인데 num > 10 이냐고 물었으니 truth는 참이된다. 그러므로

if문도 통과하여 안드로 들어가 System.out.println 을 수행하여 

계산 결과가 10 보다 큽니다 라고 결과 값이 출력 되었다.


대충 뭐가 뭐보다 크다 정도는 알고 넘어가야 되지싶다. 정수를 그렇게 빡세게 다뤄보지않아서 

타입 관련 오류를 만나본 적은 없지만, int 의 최대 값인 +2147483647  이 상의 값을 int 변수에 

넣는 다면 오류가 난다. 미치도록 중요한 내용은 아니지만 어느정도 모르고 가면 엉뚱한곳에서

에러 찾느라 고생일 것 같다..




  출판사 : 한빛미디어 , 저자 : 김윤명 님의 뇌를 자극하는 Java프로그래밍에서 공부한 내용입니다.

'JAVA' 카테고리의 다른 글

JAVA] 15. 자바의 연산자 -2  (0) 2011.06.09
JAVA] 14. 자바의 연산자 -1  (0) 2011.06.08
JAVA] 12. 익셉션 처리에 사용되는 try 문  (0) 2011.06.02
JAVA] 11. 매소드 호출문  (0) 2011.06.02
JAVA] 10. 반복문  (0) 2011.05.31
posted by 젊은쎄오
:
JAVA 2011. 6. 2. 22:08
자바에서는 프로그램 실행 중에 발생하는 에러를 익셉션(exception, 예외) 라고 한다.

익셉션 처리, 예외처리 같은 말이다. 다음 예제를 보자.

class ExceptionTest {
public static void main(String args[]){
int a = 3, b = 0;
int result;
result = a / b;
System.out.println(result);
System.out.println("Done");
}
}
위으 소스를 보면 3 을 0 으로 나누는 불가능한 연산을 하라그랬다.  로그에 보면

java.lang.ArithmeticException:  이런식으로 익셉션이 발생한 것을 확인 할 수 있다.

바로 이럴 때 try문을 사용하여 예외처리를 할 수 있다.

기본형식은 이렇다.

try{

}
 catch{

}
 finally{


이렇게 세가지의 블록으로 나뉘며 하나씩 살펴보면 try 블록안에는 위 예제의 result = a / b; 처럼

예외상황이 발생할 가능성이 있는 명령문을 써넣어야 하고 catch문 에는 그 예외상황을 처리할 수 있는

명령문을 넣어야 한다. 그리고 finally 에는 위 블록의 익셉션 여부와 상관없이 마지막에 수행되는 

명령문을 넣는다. 모두 넣은 예제를 보자.

class ExceptionTest2 {
public static void main(String args[]){
int a = 3, b = 0;
int result;
try{
result = a / b;
System.out.println(result);
}
catch(java.lang.ArithmeticException e){
System.out.println("연산이 잘못 되었습니다");
}
finally{
System.out.println("Done");
}
}
}
맨 위의 3을 0으로 나누어 오류가 났던 소스를 익셉션 처리한 것이다. 소스를 보면 try문에서 

연산을 한다. catch 문에선 그 연산이 오류가 있을 때 연산이 잘못되었다고 찍게 만들고

마지막으로 작업이 완료되었다는 Done 을 finally에 찍어주었다.

컴파일 해보면 역시나 연산은 안되고 catch문의 "연산이 잘못 되었습니다" 가 뜬 뒤 아래에

Done. 이 찍혔다. finally 문은 생략이 가능하고 catch 아래에 System.out.println("Done");을

찍어도 위와 같은 결과가나온다. catch 안의 java.lang.ArithmeticException e 는 익셉션 변수타입과

이름이다. 이름에 해당하는 e 는 프로그래머가 정할 수 있지만 앞에 익셉션 변수 타입은 반드시

발생하는 익셉션 종류와 맞아야 한다. 지금 쓴 익셉션의 종류는 연산결과에 오류가 있을 때 사용하는

익셉션이고 자세한건 여기에 있다. 

try문이 중첩되었을 때는 어떻게 하는지 보자.

class ExceptionTest3 {
public static void main(String args[]){
int divisor[] = { 5, 4, 3 ,2 ,1, 0};
for (int cnt = 0; cnt < 10; cnt++){
try{
int share = 100 / divisor[cnt];
System.out.println(share);
}
catch(java.lang.ArithmeticException e){
System.out.println("연산이 잘못 되었습니다");
}
catch(java.lang.ArrayIndexOutOfBoundsException e){
System.out.println("배열이 잘못 되었습니다");
}
}
System.out.println("Done");
}
}

소스를 살펴보면 divisor[cnt] 란 배열이 있고 값이 5,4,3,2,1,0 이 있다.

int share = 100 / divisor[cnt]; 여기에 100을 divisor[cnt] 로 나누는데 

이 배열의 cnt 는 for문 때문에 열번을 돌게 된다, 5,4,3,2 이런식으로 차례대로 순번이 올라가면서 

100을 나눠댄다. 하지만 마지막 여섯번째를 돌 때 값이 0이 들어오므로 연산이 안되고 
 
첫번째 catch(java.lang.ArithmeticException e){ 문이 동작한다. 

그리고 하나더 문제가 있다. 배열의 갯수는 여섯개인데 포문은 열번을 돌아버리니 배열이 모자라

익셉션이 난다. 그래서 두번째 catch(java.lang.ArrayIndexOutOfBoundsException e){ 이것을 

넣어준 것이다. 배열관련 익셉션 처리 구문이다. 결과값을 보자

20
25
33
50
100
연산이 잘못 되었습니다
배열이 잘못 되었습니다
배열이 잘못 되었습니다
배열이 잘못 되었습니다
배열이 잘못 되었습니다
Done

예상한대로 다섯개를 돌고 여섯번째는 0이기 때문에 연산오류  catch문이 동작했다. 

그리고 배열이 모자른 7,8,9,10 번째 배열은 모두 배열익셉션이 났다.

오늘 배운 예외처리는 실무에서 기능 구현만큼이나 신경을 써야한다. 어느부분에서 어떤이유로

오류가 나던 이 try / catch 문을 이용하여 시스템이 죽어버리는 일이 생기면 안된다.

사용자 입장에서 보면

아무리 기능이 좋고 편리한 앱 또는 프로그램이라도 툭하면 꺼지고 죽어버리는 프로그램이라면

며칠 못가 지우거나 기능이 한단계 낮아도 안정적인 프로그램을 쓸 것이다.




  출판사 : 한빛미디어 , 저자 : 김윤명 님의 뇌를 자극하는 Java프로그래밍에서 공부한 내용입니다.

'JAVA' 카테고리의 다른 글

JAVA] 14. 자바의 연산자 -1  (0) 2011.06.08
JAVA] 13. 자바의 타입 분류 체계와 프리미티브 타입  (0) 2011.06.07
JAVA] 11. 매소드 호출문  (0) 2011.06.02
JAVA] 10. 반복문  (0) 2011.05.31
JAVA] 9. 조건문  (0) 2011.05.31
posted by 젊은쎄오
:
JAVA 2011. 6. 2. 00:33
지금까지의 예제들을 보면 매소드가 main 매소드 하나였다. 하지만 클래스 안에 하나 이상의 

매소드를 쓸 수 도 있다. 다음 예제를 살펴보자.

class MethodTest {
public static void main(String args[]){
printCharater('*', 30);
System.out.println("Hello, Java");
printCharater('-', 30);
}

static void printCharater(char ch, int num) {
for(int i = 0; i < num; i++)
System.out.print(ch);
System.out.println();
}
}

붉은 색의 main 매소드와 녹색의 printCharater 매소드가 있다. 앞에서 말한 적이있는데

클래스는 main 매소드를 꼭 가져야 하며 이 매소드는 클래스가 실행될 때 처음 실행되는 

부분이다. 그러므로 main 매소드는 자동으로 실행이 되지만 printCharater  매소드는 

어디에선가 호출을 해줘야만 수행을 한다. 위의 소스를 보면 

printCharater('*', 30);  
printCharater('-', 30);  

이 두 줄이 각각 printCharater  매소드를 실행시키는 매소드 호출문이 된다.

프로그램을 위에서부터 수행하는 도중 매소드 호출문을 만나면 실행의 흐름을 

해당 매소드로 이동하여 그 매소드를 다 읽고 다시 돌아와서 나머지를 수행한다. 

위에서 보면 main 매소드를 들어와 printCharater('*',30);을 만나 매소드가 호출되면

녹색의 printCharater 매소드를 전부 수행하고 다시  printCharater('*',30);으로 돌아와

다음줄인 System.out.println("Hello, Java"); 를 실행한다.

때로는 매소드를 실행하는데 필요한 데이터를 매소드를 호출하는 쪽에서 매소드로 

넘겨주어야 할 때가 있다. 이럴 때 넘어가는 값을 파라미터(Parameter) 라고 하며 

위 예제처럼  printCharater('*',30); 소괄호 안에있는 두 가지가 파라미터가 된다.

이렇게 넘겨주면 받는 쪽에선 static void printCharater(char ch , int num);

이런식으로 받는데 잘 보면 char라는 타입과 int 타입을 받는다, 

위에서 매소드에 데이터를 넘겨줄 때에는 이 데이터타입에 맞게 넣어야 하며 타입이 

일치하지않으면 수행하지 않는다, 타입에 맞게 순서대로 넣는 것이 중요하다.

매소드 호출문 작성방법

매소드 이름 ( 파라미터1, 파라미터2);

파라미터 갯수는 많아도 상관없지만, 받는 쪽에서도 그만큼의 갯수와 타입이 맞아야한다.

위 소스 를 수행해보면 아래와 같은 결과가 나온다. 

******************************
Hello Java.
------------------------------
이유는 충분히 아실만하게 위에 설명했는데 이해가 안가신다면 난감효..

리턴값을 받는 매소드 호출문 

어떤 매소드는 주어진 일만 실행하는 것이 아니라 실행의 결과를 호출한 쪽으로 돌려준다.

그런 결과를 매소드 리턴값 (return value) 이라고 하는데 이런 리턴값을 받으려면 

다음과 같이 작성해야한다.

변수  = 매소드이름 ( 파라미터1, 파라미터2);
예) sum = add(1,2);

예제를 보자.

class MethodTest2 {
public static void main(String args[]){
int result;
result = add(3,4);
System.out.println(result);
}

static int add(int num1, int num2) {
int sum;
sum = num1 + num2;
return sum;
}
}

int 형의 result 변수에 add매소드를 호출한다 파라미터를 3,4 를 넘겼다 .

add매소드를 가보면 타입에 맞게 num1,num2로 파라미터를 받는다.

그럼 순서대로 num1엔 3이 , num2엔 4가 대입된다. 이제 add 매소드에서

num1 과 num2 를 사용하여 연산을 수행한다. 예제를 보면 이 둘을 더하여 sum이라는

변수에 담는다. 그럼 sum은 7이 될 것이다. 그러고 return sum; 을 한다.

return은 매소드의 호출부로 값을 되돌려 주는 것이다. 다시말해 

이 의미는  result = add(3,4); 여기서 add(3,4)가 호출부이기 때문에 return sum; 의 

sum이 add(3,4) 자리에 들어간다. 즉 result = 7 과 같은 의미이다.  
 
System.out.println(result); 이렇게 찍어보면 역시나 7이 딱 찍힌다.

여기서 주의 할점은   result = add(3,4); 이처럼 호출부를 담는 result 라는 변수는 

int 형인데 이 타입을 호출받는 매소드도 이 타입이여야한다.

static int add(int num1, int num2) { 여기서의 int 가 그 이유이다.

만약 호출부에서 

String arr;
arr = str("A, "B");

이런식으로 문자형으로 보내면 받는 쪽의 매소드도

static String str(String ar1, String ar2) 이여야 한다. 기억해야놔야 할 것 같다 

호출부를 담는 변수의 타입에 맞게 매소드 타입도 맞춰줘야 된 다는 것을.

참고로 리턴 값이 없어도 되는 매소드는 return; 이런식으로 따로 넘겨줄 값을 적지않고

세미콜론(;) 으로 마무리짓는다, 이렇게 하면 맨처음 예제에서도 보았듯 호출부로

되돌아가기만 한다. 그리고 방금 말했던 타입을 넣는 부분엔 void 라는 것을 쓴다.

맨처음 예제의 static void printCharater(char ch, int num) 에서의 void가 그 이유이다.

printCharater 라는 매소드에는 리턴해주는 값이 없기때문이다. 

void가 붙으면 이 매소드는 리턴값이 없고 그냥 작업을 다하면 호출부로 되돌아가는구나

라고 알고있으면 될 것 같다. 

이것 만 알고 있어도 소스 흐름을 읽는데 많은 도움이 되고 이해할 수 있었다.

이해 안가는 부분이 없을 때까지 봐둬야 겠다. 설명이 구려서 이해를 못 할지도 모르겠다.. ☞☜













출판사 : 한빛미디어 , 저자 : 김윤명 님의 뇌를 자극하는 Java프로그래밍에서 공부한 내용입니다. 
posted by 젊은쎄오
:
JAVA 2011. 5. 31. 23:47
똑같은 명령을 반복 수행 하는 프로그램을 짜기위해 조건문을 무식하게 여러번쓰는건 비효율적이다.

그럴 때를 위해 반복문이란 것을 쓰는데, 자바에서의 반복문은 세가지로, while, do, for문이다.

while 반복문

while문의 기본형식은 다음과 같다.

while ( 조건식 )     ------ 조건식이 true 인지 false인지 판별한다
      실행 부분        ------ 조건식이 true 일 때 수행한다.

while문은 조건식을 판별하여 true이면 실행부분을 수행하고 조건식을 다시 판별하고, 

이런식으로 조건식 > true > 실행부분 무한 반복이다. 한번 돌 때마다 조건식은 다시

계산되지만 계속 참이라면 무한루프에 빠진다. 

class whileTest {
public static void main(String args[]){
int i = 0;
while ( i < 5){
System.out.println(i);
i++;
}
System.out.println("Done.");
}
}
위와 같이 프로그램을 짜면 처음에 i에 0이 들어가고 5미만이므로 while문을 만족하고 

안으로 들어가  System.out.println(i); 를 수행하여 0을 찍고 i++; 로 0에서 1이된다.

그러고 다시 while 조건식으로 가서 참인지 거짓인지 판별하고, 그렇게 0,1,2,3,4가 찍히고

5일 때 false가 뜨며 빠져나와  "Done."이 찍힌다. 

do-while 반복문
 
do-while의 기본형식은 이렇다

do
  실행부분              ----- 조건식이 참 일 동안 반복 실행되는 부분
while(조건식);        ----- 참 또는 거짓 값을 산출할 수 있는 식.

do-while 은 while과 달리 do부분 , 즉 실행부분을 무조건 한번 실행하고 다음부터

조건식으로 참, 거짓을 판별한다. 

class dowhileTest {
public static void main(String args[]){
int i = 0;
do{
System.out.println(i);
i++;
} while ( i < 5);
System.out.println("Done.");
}
}
위와 같이 짜면 일단 무조건 0을 찍고 i++로 i를 1로 만든다음 조건식으로 간다.

뭐 대단한거 같아도 결과는 while과 같은 0,1,2,3,4 찍고 만다.  

System.out.println("Done."); 얘가 while 아랫줄에 있다고 while조건식 읽고

찍히는게아니다. while조건식 판별하고 참이면 do로 올라간다. 

for 반복문

for 문으로 만든 반복문은 주어진 횟수만큼 처리를 반복하거나 배열 항목을 순서대로 처리할 때 

적합하다. 기본형식은 아래와 같다.

for ( 초기화식 ; 조건식 ; 업데이트식)
  실행 부분


어려운 거 같아도, 초기화식은 사용할 값의 초기값, 조건식은 위 while문의 조건식마냥 조건이 들어가고

업데이트 식은 i++ 도는 i-- 등과 같이 변수의 값을 바꾸는 식이 들어간다.

for( int i = 0; i < 10; i++)
   System.out.println(i); 이렇게 말이다.


class forTest {
public static void main(String args[]){
for(int i = 0; i < 5; i++){
System.out.println(i);
}
System.out.println("Done.");
}
}
위와 같다. 결과는 똑같다 0,1,2,3,4 찍히고 Done이다.

향상된 for 문

for문의 카운트가 오로지 배열의 인덱스로만 사용된다면 향상된 for문을 사용할 수 있다.

* 향상된 for문은 JDK 5.0 부터 지원한다.

for ( 변수타입 변수이름 : 배열이름)
   실행부분


for ( int i : arr)
   System.out.println(i); 


이런 형식으로 사용한다면 배열의 항목 수 만큼 실행부분을 반복하는데 매번 반복할 때마다

배열 항목의 값을 변수에 자동으로 대입한다. 예제는 아래와 같다.

class forTest {
public static void main(String args[]){
int arr[] = {10,20,30,40,50};
for(int i : arr){
System.out.println(i);
}
System.out.println("Done.");
}
}
이런식으로 사용하면 저절로 arr[] 에 i 가 들어가서 arr[i] 가 찍힌다.

System.out.println(i); 여기에 i 가 찍힌다고 0,1,2,3,4 이렇게 수행 횟수가 찍히는게 아니다.

향상된 for 문에도 단점은 있는데 여기서 나온 값인 i 는 사용할 수만 있고 바꿀수는 없다.

break 문

위의 세가지 반복문을 빠져나가고 싶으면 빠져나가고 싶은 부분에 break;를 걸어주면 

위에서 수행하고 break;를 만나며 그 반복문을 빠져나오게 된다.

class breakTest {
public static void main(String args[]){
for(int row = 0 ; row <3; row++){
for(int col = 0 ; col < 3; col++){
System.out.println("("+ row+","+col+")");
if((row == 1 )&&(col == 1))
break;
}
}
System.out.println("Done.");
}
}
이렇게 하면 
(0,0)
(0,1)
(0,2)
(1,0)
(1,1)
(2,0)
(2,1)
(2,2)
Done.
.

1,1 일 때 break; 가 걸려 빠져나와 버린다. 그럼 row의 1은 더이상 수행하지 않고 빠져나오고

2로넘어가 나머지를 수행한다. 여기서 중첩된 반복문을 전부 빠져나가는 방법은 이렇다.

앞에 반복문에 라벨을 붙여놓고 break  문에 해당 라벨을 같이 써주면 중간에 반복문이

몇개가 겹쳐있던 라벨이 있는 밖으로 빠져나간다.

loop:
for(int row = 0 ; row < 3; row++){
for(int col = 0 ; col < 3; col++){
System.out.println("("+ row+","+col+")");
if((row == 1 )&&(col == 1))
break loop;
}
}
이렇게 말이다.

반복문을 계속하는 continue 문

기본형식은 이렇다 .

continue;

이 문을 만나면 바로 반복문의 다음번 과정으로 넘어간다, continue 아래에 있는 구문은

수행되지않고 바로 위로 올라가 다음번 반복문을 수행한다.

class continueTest {
public static void main(String args[]){
for(int col = 0 ; col < 10; col++){
if(col == 5)
continue;
System.out.println(col);
}
System.out.println("Done.");
}
}
이렇게 하면 5가 들어올 시 continue를 만나 바로 6으로 넘어가기 때문에

아래 System.out.println(col);가 안찍히게되고 0,1,2,3,4,6,7,8,9, 와같이 

5가 안 찍힌다.

break 문은 라벨을 이용하여 밖의 반복문으로 빠져나왔지만 continue는

라벨을 이용하여 바깥쪽 반복문을 다음번 과정으로 수행할 수 있다.  


길긴 하지만, 프로그램 짜보면서 가장 많이 써본 for문에 대해 다시 개념을 잡게됐다. 

특히 향상된 for문은 잘쓰면 아주 간결하고 깔끔할 것 같다. 사용만 할 수 있는게 

흠이긴 하다..







출판사 : 한빛미디어 , 저자 : 김윤명 님의 뇌를 자극하는 Java프로그래밍에서 공부한 내용입니다.

'JAVA' 카테고리의 다른 글

JAVA] 12. 익셉션 처리에 사용되는 try 문  (0) 2011.06.02
JAVA] 11. 매소드 호출문  (0) 2011.06.02
JAVA] 9. 조건문  (0) 2011.05.31
JAVA] 8. 배열의 선언, 생성, 이용  (0) 2011.05.28
JAVA] 7. 여러가지 대입문  (1) 2011.05.26
posted by 젊은쎄오
: