자바3강 - 기초문법

2018. 11. 10. 20:12IT/JAVA

3강 자바기초문법


번외편


int b=10, c=3;

float a;


a = b/c; // 이경우는 b나 c둘중에 하나를 float로 캐스팅해야 된다. 연산이라는 것은 같은 데이터형을 가져야만 연산이 된다.


System.out.println(""+a+b); // ""은 문자열이고 a와 b는 정수이다. 연산은 왼쪽부터 차례대로 이루어지기 때문에 문자열 + 정수 인 경우 정수인 부분은 문자열로 자동으로 변환이 된다. 그러므로 결과는 a+b가 된다.


* 현대의 프로그래밍할때는 효율성보다는 가독성이 더 중요하다.

* String은 클래스이고 클래스는 객체를 만들어서 이용한다.

* 익숙해진다는 것은 시간을 들여서 자꾸 접해라. 그러면 도통할 때가 있다.

* a = a+b; 와 a+=b; 둘중에 후자가 더 이해하기 쉽다.

* int sum+=a;를 컴파일 하면 에러가 난다. 왜냐하면 연산은 우변을 완성후 좌변이 실행되는데 sum은 아직 존재하지 않은것이므로 에러가 난다.

* 프로그래머가 될려면 컴퓨터를 신뢰하고 자신이 옳다고 생각해선 안된다.


 


오늘 강의


상수변수 : 프로그램 내에서 변경되지 않는 값을 나타냄

final double TIME_WAGES = 850; // final : 변하지 dkgsms 값을 final을 붙입니다.

상수변수를 이용하면 이해하기 쉽고, 변경이 필요할 시 한번만 바꿔주면 사용한곳 모든곳에 적용이 된다.


 import문은 자바 프로그램에서 외부의 클래스를 사용하기 위해 클래스를 메모리에 로드하는 작업이다.

예 : import java.awt.*; // awt 안의 클래스만 가져옴!!


import java.awt.event.*; // awt안의 서브 패키지인 event안의 클래스를 가져옴

라이브러리는 자주사용되는 클래스를 자바에서 미리 제공해주는 클래스이다.(패키지)

자바에서 java.lang 패키지는 기본적으로 import가 되어 있다. 그래서 System.out.println() 메소드를 사용할 수 있는 것이다.


Random 이란 클래스를 이용하여 난수를 발생할 수 있다.

클래스는 객체를 이용하여 사용한다. 그 방법은 다음과 같다.


Random rand

1. 객체를 만드는 것은 일단 선언을 하여야 한다. 객체의 이름은 소문자로 시작하고, 클래스는 대문자로 시작한다. 권고사항.


int i=5; // 선언과 동시에 메모리의 장소가 만들어진다.

i는 정수를 저장하는 변수이다. i는 int형 변수의 이름이다.


int, float, double, long, char 은 primitive 변수이다.

Random rand는 Random 클래스의 rand 변수이다. ‘rand는 Random 클래스의 객체를 가리키는 변수이다‘ 라는 선언이다.


Random rand = new Random(); // new는 객체생성연산자 혹은 객체생성명령이다.

// Random() 는 생성자 메소드이다.

이것을 실행하면 Random 클래스의 객체가 생성된다. 위치는 있지만 이름은 없다.

‘=’ 가 해주는 일은 ‘=’가 이것을 연결함으로써 그 위치를 rand 변수에 저장하는 것이다. 그래서 reference 변수라고 부르는 것이다.


rand란 이름으로 객체를 만들었으면 사용해야 되는데 사용법은 객체이름.매소드() 형식을 이용한다.

즉, rand.nextInt(100); // 이런식으로 표현한다.

반환한다라는 뜻은 그위치에 그값을 대신 사용하는 것을 말한다.

하지만 이상태로는 아무것도 활용할 수 없다. 이것을 저장할 수 있는 변수에 대입하여야 한다.


int randNum=0;

randNum = rand.nextInt(100); // 이것은 0~99까지 난수를 만든후 그것을 randNum에 대입한다.


다른 예를 해보겠다.

PrintWriter pr = new PrintWriter(System.out);

클래스의 생성자는 클래스의 이름과 똑같고, 매서드의 일종이니까 ()가 들어간다.

System.out 화면에다가 출력하는 인수이다. System.out는 java 표준 출력장치이다. 즉 모니터!!!


pr.write("난수 : + randNum); // String에 해당하는 것이 화면에 출력된다.

pr.close(); // stream 이기 때문에 닫아주었다. 자바에서는 입출력하는것들이 다 스트림으로 보고 있다. 그런 입력 출력들은 열고 닫기를 꼭 해주어야 된다.


http://java.sun.com/j2se/1.5.0/docs/api/ 사이트에 가보면 java에서 사용하는 모든 클래스가 나와있다.


 


Wrapper 클래스

primitive 데이형에 대응하는 클래스

클래스를 사용하면 정밀도의 한계를 뛰어넘을 수 있는 장점이 있다.

우리에게서 클래스의 주목할점은 클래스들의 매서드들의 활용이 있다.


String st="100"을 정수 100으로 바꾸고 싶을 때 사용한다.

화면에서 입력하는 것은 문자열로 입력이 된다. 이럴 때 정수로써의 계산이 될 수 없으므로 이 문자열을 정수로 바꿔줘야 한다. 그 과정을 하는 것이 Wrapper 클래스를 이용하여 할 수 있다.


Integer.parseInt(" ");

왜 여기서는 클래스 이름을 직접 써주었는가? 앞에서 배운 내용은 객체를 생성하여 사용해야되는데


Integer it = new Integer();

it.parseInt(" "); <- 이런식으로 써야 말이 맞는데 말이다.


그에 대한 답변으로 API 문서를 참고해서 보니 static이기 때문이다. static은 정적이란 즉, 변동이 없다는 뜻이다. static 클래스이기 때문에 이미 만들어져 있는 것이다. 객체를 생성하지 않아도 메소드를 사용할 수 있다. 그러므로 다시 만들필요 없이 클래스이름.매소드 형식으로 사용할 수 있다. 앞에서 보았던 Random rand = new Random(); 인경우는 dynamic 클래스 임으로 설계도는 있고 아직 할당이 되어 있지 않기 때문에 할당하는 과정이 필요한 것이다.


또, 변수도 static으로 선언할 수 있는데

class Test

{

int k;

public int c();

}


Test t = new Test();

t.c(); 객체 t를 찾아가서 c()라는 메소드를 가져와라

t.k; 객체 t를 찾아가서 k라는 맴버변수를 가져와라.


Test m = new Test();

m.c(); 객체 t를 찾아가서 c()라는 메소드를 가져와라

m.k; 객체 t를 찾아가서 k라는 맴버변수를 가져와라.


t.k 와 m.k는 서로 다른 메모리에 저장되어 있다.

하지만 그 맴버변수를 같게 하고 싶다면 static 으로 선언해주면 간단히 해결된다.


 

class Test

{

static int k;

public int c();

}


Test t = new Test();

m.c(); 객체 t를 찾아가서 c()라는 메소드를 가져와라

t.k; Test 클래스에 선언된 static int k를 가져온다.


Test m = new Test();

m.c(); 객체 t를 찾아가서 c()라는 메소드를 가져와라

m.k; Test 클래스에 선언된 static int k를 가져온다.

 

예)

class Exam

{

int a;

int b;

String str=null;

public int yes(){ ....}

}


Exam ex = new Exam(); // 객체 생성

메모리 어딘가에 a를 저장하는 창고, b를 저장하는 창고, str를 저장하는 창고 그리고 yes() 메소드를 저장하는 창고가 생긴다. 그리고 ex라는 놈이 이 창고가 어디있는지 가리켜 준다.


Exam at = new Exam();

메모리 어딘가에 a를 저장하는 창고, b를 저장하는 창고, str를 저장하는 창고 그리고 yes() 메소드를 저장하는 창고가 생긴다. 그리고 at라는 놈이 이 창고가 어디있는지 가리켜 준다.


ex와 at는 분명히 다른놈이다.

ex.a를 읽어와서 사용하거나 ex.b++ 시키는 일이 있을 것이다. 그래도 at.a와 at.b는 전혀 영향을 받지 않는다. 상황이 이러한데 소스를 아래와 같이 고치겠다.

class Exam

{

static int a;

int b;

String str=null;

public int yes(){ ....}

}

 

Exam ex = new Exam(); // 객체 생성

Exam at = new Exam();


이런 경우 각 객체에 a라는 변수는 생기지 않는다. 이 경우 a라는 변수는 Exam이라는 클래스 밑에 a라는 창고가 생긴다. 그렇다고 하더라도 a라는 변수를 사용할 수 없는 것이 아니다. a라는 변수를 ex와 at가 a라는 변수를 공유하게 된다.

ex.a나 at.a나 같은 공간에서 사용된다는 것을 말하는 것이다.

static int a는 객체 밑에 생기는 것이 아니라 클래스 밑에 생긴다.

if문이 존재하면 바로 ()가 나오는데 ()안에 조건이 들어간다. 이 조건이 참이 되면 {} 안의 내용이 실행되고 false인 경우 {}가 실행되지 않는다.

if - else는 ()안에 조건이 참이면 if() {}를 실행하고 거짓이면 else {} 의 문장이 실행된다.


* 한문장만 실행되도 중괄호로 묶어주는 것이 실수하는 것을 줄일수 있다.

* () 안의 조건에는 비교연산자를 사용한다.


예제) 임의의 정수에 대하여 홀수이면 “..는 홀수입니다.” 짝이면 “...는 짝수입니다.”라고 출력해 주는 프로그램을 작성하여라.


 

try{} ... catch() {}

try는 성공할 수 있지만 실패할수있기 때문에 혹시모를 것을 대비해 예외처리를 하는 것이다.


BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

InputStreamReader isr = new InputStreamReader(System.in); // 이것만으로도 입력을 받을 수 있다. 하지만 버퍼를 이용하면 더욱 신속하게 입력을 받을수 있다.


BufferedReader br = new BufferedReader(isr);

하지만 키보드를 입력 받을때는 이름을 지정해줄 필요가 없다. 왜냐면 한번쓰고 버릴꺼니까. 그러니까 작명을 하지 말고 바로 쓴 것이 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 이다.


예제) 점수를 입력받아 학점을 출력하는 프로그램을 작성해보아라.

import java.io.*;

class Hak

{

public static void main(String[] args){

int score=0;

String str=null;

System.out.println("당신의 학점을 입력하세요 : (예 : 95)");

try{

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

score = Integer.parseInt(br.readLine());

}catch(IOException e){

System.out.println("너 잘못 입력했어");

}

if(score >= 90)

{

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

}

else if(score >=90)

{

System.out.println("A0");

}

else if(score >= 85)

{

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

}

else if(score >= 80)

{

System.out.println("B0");

}

else if(score >= 75)

{

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

}

else if(score >= 70)

{

System.out.println("C0");

}

else if(score >= 65)

{

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

}

else if(score >= 60)

{

System.out.println("D0");

}

else

{

System.out.println("F");

}

}

}