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 젊은쎄오
: