자바4강 - if문, while문, 비교연산자

2018. 11. 11. 22:07IT/JAVA


4강

자바는 객체지향언어이다. 즉 객체를 중심적으로 프로그래밍 한다.

객체는 존재, 물건, 실체 이다. 이전에 클래스라고는 하는 것은 객체랑 대비하면서 말씀을 드리면서 클래스는 설계도이고 객체는 자동차이다. 그러므로 클래스자체로는 이용할수 없으므로 클래스를 객체로 만들어서 사용하는 것이다.


그럼 이젠 실제로 사용해보자.

System.out.println


이것은 System.out 의 println() 메소드이다. 이것을 풀어쓰면 System.out가 표준화면이란 클래스이고 여기에 표시하는 것이 println() 메소드를 이용하여 프린트한다는 것을 한눈에 알 수 있게 되었다.


C언어는 기능언어로써 함수가 주인이다. 단, 함수의 주인은 없다.

예를 들어 print를 한다고 했을 때 printf()는 그 자체이다. 용도에 맞게 인수를 써주는것이 함수의 특징이다.

printf()만으로 보면 화면으로 할것인가 프린터로 할것인가는 알수가 없다.


 


계산기(사칙연산)

String str1=null;

String str2=null;

String str3=null;


 


// 입력 받는 매커니즘

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

System.out.println("첫번째수 입력“);

str1 = br.readLine();

System.out.println("부호“);

str2 = br.readLine();


System.out.println("두번째수 입력“);

str2 = br.readLine();

// BufferedReader 라는 클래스를 br로 객체를 만들어서 사용했다. 그러므로 br이란 객체는 프로그램내에서 언제든지 사용할 수 있게 되는 것이다. 몇 번이여도 상관없다. 계속 이용할 수 있기 때문에 매번 객체화를 시킬필요가 없는 것이다.


if(str2.equals("+"))

{

System.out.println(a+b);

}

else if(str2.equals("-"))

{

System.out.println(a-b);

}

else if(str2.equals("*")

{

System.out.println(a*b);

}

else if(str2.equals("/")

{

System.out.println(a/b);

}

else

{

System.out.println("병신아“);

}

// String이라는 클래스에 str2라는 객체를 만들었다. String 클래스안에는 equals()라는 메소드가 존재하는데 이 메소드의 의미는 인수와 객체가 같은지 True와 False로 반환해주는 역할을 하는 메소드이다. 이 메소드를 사용할려면 객체화된 str2.equals(인수); 형식으로 사용한다. str2.equals("+")와 “+”.equals(str2)는 같은 결과를 표시한다. 이것이 가능한 이유는 “+” 자체로도 객체이기 때문이다.

}

}



/* if문의 중첩 */

class Nestedifelse {

public static void main (String args[]) {

int a=5;

if(a>=0) {    

if(a==0) {

System.out.println(a + “는 0.”);

}

else{

System.out.println(a + “는 양수.”); 

}

}

else{

System.out.println(a + “는 음수.”);

}

}

}


* 프로그래밍은 정답이 없다. 정답을 쫓아 프로그래밍을 한다면 응용할 수 없기 때문이다. 그러므로 자기가 나름대로 연구하고 노력하는 모습을 가져야 프로그래머라 할 수 있다.


* 수학문제는 문제의 조건을 정확하게 분석하면 그 안에 답이 있다. 프로그래밍도 똑같다. 조건을 잘 봐라. 그럼 길이 보일 것이다.


 


문제. 1부터 9999까지의 수에 대해 몇 자리 수인지 출력해 주는 프로그램을 만들어라.

if(a<10)

{

System.out.println("1자리“);

}

else if(a<100)

{

System.out.println("2자리“);

}

else if(a<1000)

{

System.out.println("3자리“);

}

else

{

System.out.println("4자리“);

}


논리형 변수인 Boolean 변수는 조건문에 들어갈수 있다. 자바에서는 정수가 조건문에 못들어감을 상기하라.

조건식은 참이나 거짓으로 값이 결정될 수 있는 식이여야 한다는 것을 상기하라.

기본적으로 비교연산자 또는 논리연산자를 이용하여 만든다.


 


while 문


조건문 또는 boolean형 변수가 TRUE일 때 {}안의 실행문을 반복해서 실행한다.

while문은 간단하기 때문에 잘못사용하는경우가 흔하다. 특히 무한루프에 빠지지 않도록 조심해야한다.


 public static void main(String args[ ]) {

int a = 0;

while(a < 10) {

System.out.println("2 * " + a + " = " + (2 * a));

a++; // 무한루프에 빠지지 않도록 이처럼 빠져나올수 있는 장치를 마련해야한다. 즉, 조건식에서 쓴 변수가 while문 안에서 변수가 조건이 거짓이 될수 있도록 계속 변해야 한다.

}

}


또 무한루프를 빠져 나올수 있는 문장은 break문을 넣으면 된다.

public static void main(String args[ ]) {

int a = 0;

while(true) {

System.out.println("2 * " + a + " = " + (2 * a));

if(a>=9)

break; // 이 문장을 사용하면 무한루프에서 빠져나올수 있다. 사용상 주의할점은 break 문을 사용할때는 문장위치가 중요하다. 이것을 지키지 않는다면 예상한 결과값이 다를수 있기 때문이다. 위치결정을 잘해야한다.

a++;

}

}

 

비교연산자 : 연산자의 양변을 서로 비교하는 연산자

연산자의 우선순위라는 것이 있는데 예를 들면 c = a==b 라고 하면 비교연산자가 대입연산자보다 우선순위가 높다. 하지만 가독성을 위해서는 c = (a==b)처럼 괄호를 사용것이 좋다.


 

String str1 = "동양“;

String str2 = "동양“;

str1과 str2는 서로 같은것이라 할 수 있다. 왜냐하면 “동양” 이라는것도 객체가 될 수 있는다. str1과 str2는 레퍼런스 변수이다. 메모리에 “동양”이라는 저장공간이 할당되어 있는곳을 str1이 “동양” 이 저장된 주소를 저장하고, str2도 “동양”이 저장된 주소가 저장된다. 그러므로 str1과 str2는 서로 같은것이라 할 수 있는 것이다. 물론 if(str1 == str2) 는 참이 된다. “동양” 이라는 동일한 주소를 str1과 str2가 저장하기 때문에 참이 나오는 것이다.


하지만 "동양“ 메모리 주소와 ”동양“ 이라는 메모리 주소가 다른경우는 어떨까?

String str3 = new String("동양“);

String str4 = new String("동양“);


str3.equals(str4)를 하였을 경우 str1, str2들의 문자열이 같이 때문에 참이 나온다.

하지만 또 if(str3 == str4)인경우는 거짓이 나온다. 왜냐하면 str3가 가르키는 “동양”의 주소와 str4이 가르키는 “동양”의 주소가 다르기 때문에 거짓이 나오는 것이다. new라는 연산자가 새로운 메모리공간을 할당하는 역할을 하기 때문에 서로 다른 공간에 “동양” 문자열이 저장이 되는 것이다.


문제를 풀때에는 무식한 방법으로 하고 나중에는 개선된 방법을 찾아보는 것이 프로그래밍을 잘하는 것이다.


 work book 과제 1 P.15


소수 Prime Number

= 1과 자신으로만 나누어 떨어지는 수

= 1과 자신이 아닌수로 나누어 떨어지면 소수가 아니다.


x : 입력받은 수

a : 범위(2부터 (x-1)까지)


x%2==0인가? yes 이면 x는 소수가 아니다. no면 아래 실행.

x%3==0인가? yes 이면 x는 소수가 아니다. no면 아래 실행.

.... no면 아래 실행.

... no면 아래 실행.

x%(x-1)==0인가? yes이면 x는 소수가 아니다.

전체를 no이면 x는 소수이다.


int a=2;

while(a<x)

{

if(x%a == 0)

{

System.out.println("소수가 아님“);

}

a++;

}

이것의 문제점은 짝수일 경우 소수가 아님 이라는 문장이 계속 나올수 있는 문제가 있지만 원하는 결과는 나올수 있다. 무식한 방법으로 기본적인 틀을 주었으니 형원이 너가 더 좋게 프로그래밍 하라.

/*

* 키보드로 숫자를 입력받아

* 그 숫자가 소수인지 아닌지

* 판별하는 프로그램을 짜라.

* 작성자 : 윤형원

*/

import java.io.*;

class Prime

{

public static void main(String[] args)

{

int a=2; // 나눠지는거 시작하는 숫자

int inputNumber = 0; // 입력받는 숫자

Boolean con = true; // 소수인지 아닌지 판별해주는 변수

System.out.println("소수인지 판단할 숫자를 입력해 주세요 : ");

try

{

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

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

}catch (IOException ioe)

{}

while(a<inputNumber)

{

if(inputNumber%a == 0)

{

con = false;

break;

}

a++;

}

if(con)

{

System.out.println(inputNumber+"는 소수이다");

}

else

{

System.out.println(inputNumber+"는 소수가 아니다.");

}

}

}



/*

* 숫자를 입력받아

* 2부터 입력받은 그 수까지의 모든 소수를

* 출력하는 프로그램

* 작성자 : 윤형원

*/


 import java.io.*;


class Prime2

{

public static void main(String[] args)

{

int x, y, a;

x=0;

System.out.println("소수를 입력하셈:");

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

try

{

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

}

catch (IOException o)

{

System.out.println("IOException입니다.");

}


// 2부터 시작하여 입력된 값 x까지 모든 수에 대해 아래 코드를 실행

// 즉, y값을 바꾸어 가면서 아래 코드를 실행해 주면 된다.

y = 2;

while(y <= x)

{  

a=2;

boolean prime = true;

while(a<=y/2 && prime)

{

if(y%a == 0)

{

prime = false;

}

a++;

}

if(prime)

{

System.out.println(y);

}

y++;

}

}

}


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

오늘 수업을 하면서 느낀것은

내가 논리적인 사고가 많이 부족한것을 느꼈다.

단계 단계 순서를 잘 파악하고 있어야 프로그래밍이란것을 잘 할 수 있는데

나는 그 과정의 훈련이 덜 되었다는것을 온몸으로 느낄수 있었다.

반면 인문계 나온 애들은 잘 푸는것이 눈에 보였다.

열등감도 들고 내 자신에게 너무 화가 난다.ㅠㅠ

머리가 나쁘니 노력을 더 많이 해야겠다.

그래야 따라갈것 같으니까 말이다ㅠㅠ

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