오늘 공부한 내용은 클래스와 인스턴스다.
이전 C언어와 두드러진 특징 중 하나가 자바는 객체지향언어라는 점이다.

이 객체에 대한 개념을 이해하는 것이 중요하다.
* 객체지향 프로그래밍은 현실에 존재하는 사물과 대상, 그리고 그에 따른 행동을 있는 그대로 실체화시키는 형태의 프로그래밍이다.

객체를 생성하려면 class가 필요하다.
class를 먼저 설계하고 선언해두고,
이를 이용해 객체를 생성하는 것이다.

* 전에 javac 컴파일을 하면 class 이름으로 .java 파일이 만들어진다고 했었는데 그럼 클래스가 여러개이면 어떻게 될까? -> 클래스의 수만큼 .java 파일이 생성된다.

(class를 선언했다고 객체가 생성되는 것은 아니다.)
객체를 공부하다 보니 C와 비슷한 놈이 떠올랐다.
구조체다.
수업시간에 교수님이 C언어에서 구조체를 잘 사용하면 객체지향 프로그래밍을 할 수 있다고 얘기해 주신 것이 떠올랐다.
아..!!
:)

객체를 생성할 때
ex)
FruitSeller seller = new FruitSeller();
이런 식으로 생성하는데 맨 왼쪽의 FruitSeller는 자료형이다. 객체를 표현하는 자료형이다.
seller는 객체 변수이름이다.
new는 FruitSeller라는 객체를 생성하고 그 주소를 반환한다.
* 주소를 반환하기 때문에 seller라는 객체 변수에 주소값이 저장된다.
이 내용을 쉽게 받아들이기 위해서
메소드에서 객체를 호출하는 경우를 생각해보면 된다.
객체를 호출할 때 객체를 복사해서 전달 할까?
아니면 같은 객체를 공유하면서 사용할까?



(메소드에서 객체 호출)


(객체 호출 결과)


이 화면을 보면 알 수 있다. 객체는 같은 것을 사용하고 있다.
위에서 말했듯이 객체의 주소를 가지고 객체 이름변수에 저장했기 때문에,
객체 이름변수를 넘겨주면 그 주소를 넘겨주는 것이고 같은 객체에 접근하는 것이다.

생성자
-> 생성자는 메소드 호출 후 딱 한번만 실행되는 메소드이다.
목적은 인스턴스(객체) 변수의 초기화이다.

생성자를 이용하면 인스턴스 변수의 초기화를 쉽게 할 수 있다.

문제 7-1 2번 문제

(문제 class 설계)

-> Child라는 클래스를 만들고

생성자로 초기화

win 메소드, 추가로 작성하다보니 lose 메소드도 필요하여 추가하였다.

print 메소드 를 사용하였다.


(문제 해결 코드)


(결과 화면)


(참조 - 난 정말 JAVA를 공부한 적이 없다구요. , 윤성우)


오늘은 자바의 메소드를 공부했다.

드디어 C와는 구별되는 메소드이다.

흠, 그런데
공부하면서 보니 C언어의 함수 와 같았다.
쓰임도 같고, 모양새도 같고, 어디선가 익숙한 듯한 형식이다.

그래서 조금 더 쉽게 받아들일 수 있었다.
JAVA는 객체지향 언어로써 메소드를 잘 이용해야 자바를 쓰는 의미가 있다.
그러면 메소드를 잘 쓰는 연습을 시작해야겠다.

메소드

메소드 형식
public static void main(String[] args)
: 이 전까지 우리가 써왔던 메소드 선언이다.
void -> 반환할 값을 표시함. 정수형을 반환하면 int를 쓰면 된다.
main -> 메소드의 이름이다. (자바 프로그램의 시작은 main이라는 이름의 메소드를 실행하는 데서부터 시작한다.)
(String[] args) -> 전달받을 변수이다. 여기서 아직 String[] args 의 의미는 모르겠지만,
예로 (int a) 라고 받으면 받은 메소드 안에서 정수형 a 변수에 값을 입력받아 전달받는다.

아직 public, static, String[] args 의 의미는 잘 모르지만 뒷부분에서 더 배우기로 한다.

메소드 예시

코드


메소드 사용이다.  결과는

결과


+ 메소드에 둘 이상의 값을 전달할 수는 있어도, 메소드는 오직 하나의 값만을 반환할 수 있다.
 
+ 메소드 중간에 return 문을 만나면 나머지는 실행하지 않고 바로 메소드를 빠져나간다. (return; 만 쓸 경우)
 
+ 변수 scope -> 변수의 범위다. 변수는 { } 중괄호 안에서 선언됬다면 그 안에서만 사용가능하다.

메소드  문제
문제 6-1 1번
두 개의 정수를 전달받아서, 두 수의 사칙연산 결과를 출력하는 메소드와 이 메소드를 호출하는 main 메소드를 정의해보자. 단 나눗셈은 몫과 나머지를 각각 출력해야한다.



작성한 코드이다.  메소드의 반환을 이용하지 않고 그냥 void로 선언하여
그 메소드 안에서 계산 값들을 출력하였다.



재귀함수 -> recursive function
재귀 호출 메소드 -> recursive한 형태의 메소드를 의미한다.
메소드 안에서 자기 본인을 다시 호출하는 형태이다.
 
쉽게 이해하자면 , 팩토리얼을 예로 들수 있다.
5! = 5*4!
    
재귀 호출 문제
문제 6-3 1번
정수 N을 전달받아서, 2N승을 계산하여 반환하는 메소드를 재귀의 형태로 정의하고, 이의 테스트를 위한 main 메소드도 함께 정의하자.



재귀메소드를 이용하여 N승을 계산하였다.


2의 5승은 32입니다. 결과


메소드는 이전 C에서 해왔던
함수와 같은 기능을 하고 있었다.

(참조 - 난 정말 JAVA를 공부한 적이 없다구요, 윤성우)

 

어제 집내려갔다가
오늘 올라왔는데, 바로 잘까하다가..
JAVA공부 조오금만 하고 정리하고 자야겠다라는 생각이 들어서
책을 펼쳤다. (의지..!)

chap 5 실행흐름의 컨트롤 부분이였는데,
C 언어와 상당히 비슷했다. (그만큼 빨리 넘어갈 수 있었다.)

조금 놓치고 있었던 부분에 대해 정리해 두려고 한다.

Switch 문.

 

위의 경우 n = 2일 때,
실행내용(2), 실행내용(3)이 실행된다.
n이 1이면
실행내용 1,2,3 전부 실행된다.

(엥?. ) n이 2면 2만 실행되는거 아닌가?..

C 언어에서 배울때 관습적으로 case : 실행내용 적고 break;를 추가했었다.
바로 이게 실행내용을 이어서 하지 못하게 끊어주었던 것이다.

 

이렇게 되면 n=1 일때, 실행내용 1만 실행되게 된다.

추가로
* break;     는 가장 가까운 반복문을 탈출하는 역할을 한다.
(가장 가까운 한개의! 반복문을  탈출하는 역할을 해준다.)

* continue;     는 break;  와 헷갈리지 않게 잘 이해해야한다.
break; 는 가장 가까운 반복문 하나를 벗어나게 한다. continue;는 continue를 만나면 그 아래 반복 실행코드를 무시하고 다시 반복문조건으로 돌아간다.
(+그러므로 반복문의 조건항에 반복문을 수렴하게하는 문장이 포함되야한다. ex) n++)

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

문제 5-43번문제 풀다가

 

(첫 작성 코드)

 

(에러)

 

 

오류가 났다. 다시 코드를 확인해 보니,
비교문에서 ==을 써야하는데 =을 사용했다.
= 은 대입연산자이다..

 

(수정)

 

(실행)

 

물론 이런 실수는 오류 메세지로 코드를 다시 확인하면 쉽게 발견할 수 있는 오류지만
첫 작성시 주의할 필요가 있겠다.

 

+ Recent posts