<생성자>

생성자는 인스턴스(객체)가 생성될 때 호출되는 인스턴스를 초기화하는 메소드이다. 인스턴스 변수의 초기화에 주로 사용된다.

생성자도 클래스 내에 선언되고 구조도 메소드와 유사하지만 return값이 없다는 점이 다르다. 그런데 생성자 앞에 return값이 없다는 것을 의미하는 void를 사용하지도 않는다. 이것이 메소드와 다른 부분이다.

 

생성자의 조건

1. 생성자는 return값이 없다. (void를 써주는 것도 아님)

2. 생성자의 이름은 클래스의 이름과 같아야 한다.

 

Abc a = new Abc();

이런 구문이 있다고 가정하자.

연산자 new에 의해서 메모리에 (heap에) Abc클래스의 인스턴스가 생성된다. 생성자 Abc()가 호출되어 수행된다. 연산자 new의 결과로 생성된 Abc인스턴스의 주소가 반환되어 참조변수 a에 저장되는 것이다.

지금까지 우리가 객체를 만들때 사용했던 클래스이름()이 바로 생성자였다.

 

생성자에는 기본 생성자와 매개변수가 있는 생성자가 있고, 이들도 함수 오버로딩처럼 동작한다.

 

<실습 - 1>



-결과-



<실습 - 2>
이번에는 생성자를 오버로딩한 것을 알아보자.
생성자를 오버로딩 한 후, 다시 기본 생성자로 객체를 생성하고 싶다면, 무조건 기본생성자를 만들어 줘야한다!



<실습 - 3>



-결과-



<초기화 블럭>
초기화 블럭에는 클래스 초기화 블럭과, 인스턴스 초기화 블럭이 있다.
클래스 초기화 블럭은 클래스 변수의 초기화에 사용되고, 인스턴트 초기화 블럭은 인스턴스 변수의 초기화에 사용된다.
 
클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번만 수행되며, 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때 마다 수행된다.
 
<실습>
생성되는 순서를 잘 알아보자.


-결과-


LIST

<메소드 오버로딩(Method Overloading)>

메소드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별되어야 한다. 자바에서는 한 클래스내에 같은 이름의 메소드가 존재하더라고 매개변수의 개수나 타입이 다르면 다른 것으로 인정되어 코딩이 가능하다. 즉, 한 클래스 내에 같은 이름의 메소드를 여러개 정의하는 것을 메소드 오버로딩이라고 한다.

 

오버로딩의 조건에 대해서 알아보자.

1. 매개변수의 개수나 타입이 달라야한다.

2. 매개변수는 같고 return 타입이 다른 경우는 오버로딩이 될 수 없다. 즉, 리턴타입은 상관 없다는 것

3. 메소드 이름이 같아야 한다.

 

<실습>




-결과-


LIST

<JVM의 메모리구조>

1. 메서드 영역

어떤 클래스가 사용되면 JVM은 해당 클래스의 *.class파일을 읽어서 클래스에 대한 정보를 메서드 영역에 저장한다. 즉, 클래스의 변수인 클래스변수와 클래스 메소드(클래스 데이터) 등이 저장되는 곳이다.

 

2. Stack 영역

주로 메소드의 작업에 필요한 메모리 공간을 제공한다. 메소드가 사용되면 메소드를 위한 메모리가 할당되며 메소드가 실행하는데 필요한 지역변수 혹은 연산의 결과들을 저장하는데 사용되는 공간이다.

메소드가 작업을 마치면 스택 영역에서 소멸된다.

 

3. 힙 영역

인스턴스가 생성되는 공간이다. 즉, 객체가 생성되는 공간이다. 예를 들어 Class Abc가 있다고 가정하자.

그럼 이 클래스에 대한 객체를 Abc a = new Abc(); 이렇게 만들고 주소를 a에 저장했다고 가정하자.

Abc라는 클래스에는 여러가지 멤버변수들이 존재할 것이다. 이때 만들어진 객체를 저장하는 곳이 힙 영역이다. 인스턴스 변수들이 저장되는 공간이다.

 

<실습>




-결과-





LIST

1. 인스턴스 변수 

클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 이 변수도 만들어 진다. 인스턴스(객체)가 존재 해야지만 인스턴스 변수도 존재하는 것이다. 객체도 없는데 인스턴스 변수는 존재할 수 없다.

 

2. 클래스 변수

클래스 변수는 인스턴스 변수 앞에 static 만 붙이면 된다. 선언하는 곳은 클래스 영역이며, 클래스 변수는 모든 인스턴스가 공통된 저장공간을 공유하게 된다. C언어의 전역변수와 비슷하다.

여기서 인스턴스 변수와의 차이점은 한 가지 더있는데 생성되는 위치이다. 인스턴스 변수는 인스턴스를 생성한 후에야 사용가능하지만, 클래스 변수는 인스턴스가 없어도 사용 가능하다. 즉, 클래스가 메모리상에 로딩되면 클래스 변수가 생성되는 것이다.

접근 하는 법은 클래스이름 . 클래스변수로 하면된다.

 

3. 지역 변수

메서드 내에 선언되어 생성과 소멸이 메서드 내에서 이루어지는 변수이다. 중괄호가 쓰이는 곳, 예를들어 for문, if문 등 블록 내에서 선언된 지역변수는 중괄호를 벗어나게 되면 소멸된다.

이렇듯 지역 변수는 해당하는 블럭을 벗어나면 소멸되어 사용할 수 없게 된다.

 

<실습>

static이 붙은 클래스 변수에 대해서 실습해보자.



-결과-






LIST

'Programming > Java' 카테고리의 다른 글

Java - 메소드 오버로딩(Method Overloading)  (0) 2015.12.06
Java - JVM의 메모리구조  (0) 2015.12.06
Java - 객체 지향 언어의 정의, 용어  (0) 2015.12.06
Java - while문, do~while문  (0) 2015.12.06
Java - for문  (0) 2015.12.06

<객체지향언어란?>

“실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다” 라는 것이다. 이 개념을 컴퓨터로 그대로 옮겨놓아 언어로 만들어 낸것이 객체지향언어이다. 객체지향언어와 다른 개념으로 C언어와 같은 절차지향언어가 있다. 절차지향이란 프로그램을 시작하면 위에서부터 차례대로 수행하게 된다.

프로그램 진행 중에는 다른 자료형을 선언할 수 없기 때문에 구조체나 자료형들이 모두 미리 정의가 되어 있어야 한다.

말 그대로 절차지향언어는 명령들의 나열이라고 볼 수 있다.

절차지향언어와 객체지향언어의 가장 큰 차이점으로는 클래스와 객체가 있느냐 없느냐의 차이이다.

 

<클래스란?>

객체를 정의해 놓은 것이다. 클래스의 용도는 객체를 생성하는데 사용되는 것이다.

 

<객체란?>

클래스에 정의된 내용대로 메모리에 생성된 것을 말한다. (실제로 존재하는 것, 사물 또는 개념) 객체의 용도는 객체가 가지고 있는 기능과 속성에 따라 달라진다.

 

우리 실생활에 비춰 예를 들어보자.

에어컨설계도(클래스)는 에어컨이라는 제품(객체)을 정의한것이며, 에어컨(객체)를 만드는데 사용된다. 에어컨설계도(클래스)는 단지 에어컨(객체)을 생성하는데 사용될 뿐, 에어컨(객체) 그 자체는 아니다. 여기서 우리가 필요한 것은 무엇인가? 에어컨을 사용하기 위해서는 에어컨 설계도(클래스)가 필요한 것이 아니다. 에어컨(객체)이 필요한 것이다.

 

다시 프로그래밍으로 넘어와 프로그래밍에서는 먼저 클래스를 작성한 다음, 클래스로부터 객체를 생성하여 사용한다.

그렇다면 클래스를 왜 정의해 놓을까? 한 번 설계도를 생성해 놓으면 그 다음 제품(객체) 만드는 일은 아주 쉽고 수월하기 때문이다. 그래서 클래스를 따로 정의해 놓는 것이다.

 

JDK는 프로그래밍을 위해 많은 수의 클래스를 기본적으로 지원하고 있다. 우리는 아주 잘 만들어진 클래스들을 객체를 만들어 사용하기만 하면된다.

 

<객체와 인스턴스?>

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 한다.

어떤 클래스로부터 만들어진 객체를 클래스의 인스턴스라고 한다.

인스턴스와 객체는 근본적으로는 같지만 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있고, 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 갖는다. (객체 == 인스턴스 라고 생각해도 무방!)

 

<속성과 기능?>

속성은 멤버변수, 특성, 필드, 상태를 말하고, 기능은 메서드, 함수 등을 말한다.

class TV {

 // TV의 속성 (멤버변수)

 String color;

 boolean power;

 int channel;

 

 // TV의 기능 (메서드)

 void power() {power =! power;}

 void channelUp() {++channel;}

 void channelDown() {--channel;}

<객체의 생성과 사용>

기본 문법)

클래스명 변수명;   // 클래스의 객체를 참조하기 위한 참조변수 선언

변수명 = new 클래스명(); // 클래스의 객체 생성 후, 객체의 주소를 참조변수에 저장.

TV t;   // t라는 참조변수 선언

t = new TV();  // new TV() : 객체생성, 객체의 주소를 t에 저장


LIST

'Programming > Java' 카테고리의 다른 글

Java - JVM의 메모리구조  (0) 2015.12.06
Java - 인스턴스 변수, 클래스 변수, 지역 변수  (0) 2015.12.06
Java - while문, do~while문  (0) 2015.12.06
Java - for문  (0) 2015.12.06
Java - 2차원 배열  (0) 2015.12.06

<while문>

반복문 중에 하나로 for문과는 문법이 다르다. 

문법) 

while(조건식)

{  // while문 시작

   반복할 내용

}  // whilw문 끝

조건식이 참일 경우 반복할 내용을 1번 수행 후, 또 조건식이 참이면 계속 반복할 내용 수행... 

 

<실습> 

1~9까지의 합을 출력하면서 나타내보자.




-결과-



<do~while문>

do~while문은 while문과 거의 흡사하지만 처음 한번 수행한다는 차이점이 있다. 

반복할 내용을 무조건 한 번 수행한 후, 조건식에 의해 그 다음 반복할 내용이 수행되는지 마는지 결정된다.

문법)

do

{

   반복할 내용

} while(조건식);

해석 : 처음 "반복할 내용"을  한 번 수행한다. 그 후, 조건식에 의해 그 뒤로 계속 수행할 것인지 결정한다. 

 

<실습>  



-결과-


LIST

<for 문>

 for문은 반복문 중에 하나로 while, do~while, for중에 for가 가장 많이 사용된다.

기본 문법)

for(초깃값; 조건값; 증감값)

{

   반복할 내용

}

"조건값이 참인 동안 반복할 내용을 반복적으로 수행해라"라는 의미이다.

 
<실습>
for문 이용해 단을 입력받아 구구단을 출력해보자.


-결과-



<다중 for문>
다중 for문은 말 그대로 for문 안에 또 for문을 사용하는 것이다.
for문이 겹쳐져서 여러개 사용되면 혼동이 쉬우므로 잘 알아두길 바란다.
 
<실습>
2~9단까지 출력하는 프로그램을 짜보자.


-결과-




LIST

'Programming > Java' 카테고리의 다른 글

Java - 객체 지향 언어의 정의, 용어  (0) 2015.12.06
Java - while문, do~while문  (0) 2015.12.06
Java - 2차원 배열  (0) 2015.12.06
Java - Scanner, BufferedReader의 차이점과 개념  (0) 2015.12.05
Java - 배열  (0) 2015.12.05

<2차원 배열>

2차원 배열의 선언방법은 int[][] num = new int[][]이고, 요소 값을 넣는 방법은 1차원 배열과 똑같다.

예를 들어 int[][] num = new int[][] { {100,100,100}, {10,10,10}, {20,20,20}, {30,30,30}, {40,40,40}};

이렇게 2차원 배열의 요소를 정의했다고 가정하자.

그럼 num이라는 참조형 변수안에는 배열의 주소가 저장될 것이다.



위 배열의 메모리 공간을 도식화해서 그리면 이렇게 된다.

num이라는 변수안에는 1차원적으로 각 주소들이 나열되어 있는 1차원 배열의 주소를 저장하고 있고, 각 요소들은 1차원 int형 정수의 값을 갖고 있는 배열의 주소를 가리키고 있다.

이렇게 해서 1차원의 1차원해서 2차원이라고 부르는 것이다.

사람들이 이러한 2차원 배열을 바둑판 형식으로 그리는데 원래는 잘못된 것이다...

각 배열의 요소를 배열명을 사용해 나열하면

num[0][0]==100 num[0][1]==100 num[0][2]==100

num[1][0]==10  num[1][1]==10   num[1][2]==10

num[2][0]==20  num[2][1]==20   num[2][2]==20

num[3][0]==30  num[3][1]==30   num[3][2]==30

num[4][0]==40  num[4][1]==40   num[4][2]==40

 

<실습 - 1>



-결과-



<실습 - 2>


-결과-




LIST

'Programming > Java' 카테고리의 다른 글

Java - while문, do~while문  (0) 2015.12.06
Java - for문  (0) 2015.12.06
Java - Scanner, BufferedReader의 차이점과 개념  (0) 2015.12.05
Java - 배열  (0) 2015.12.05
Java - Switch~case문  (0) 2015.12.05

<Scanner>

자바에서는 입력받는 방법이 여러가지이다. 지금까지 우리가 사용했던 방식은 BufferedReader라는 클래스를 사용하는 것이고, 이번에는 Scanner라는 클래스를 사용하는 방법을 알아보겠다.

 

BufferedReader 장점은 단순한 구조라는 것이다.BufferedReader의 사용 메소드는 read(int형)와 readLine(String) 두 개가 전부다. 반면에 Scanner는 만능이다. Scanner는 단순히 읽어들이기만 하는 것이 아니라 parsing과 tokenizing을 할 수가 있다. 그렇기 때문에 지원하는 메소드가 상당히 많다.

BufferedReader는 String으로 출력하여 원하는 숫자나 문자로 parsing을 해줘야한다.(받아서 일일히 쪼개야 함)

Scanner는 메소드에 nextInt(), nextDouble(), nextLine()등 각자의 자료형에 따라서 선택해서 할 수 있다.

예들 들어 nexInt() - int형, nextDouble() - double형, next() - String()형 등을 사용하면 된다.

 

<실습>


위의 코드에서 보면 알겠지만 BufferedReader처럼 따로 int형으로 파싱을 안해줘도 된다.


-결과-


Scanner는 토큰을 제어할 수 있다. BufferedReader는 space bar 혹은 특수문자를 모두 문자열로 입력받아 출력하는데 Scanner는 이러한 것들을 구분자로 구분지어서 따로 입력받을 수 있다.



<실습>

코드를 보면 Scanner의 메소드인 useDelimiter를 사용하여 토큰구분자 ,(콤마)로 입력 받을때 구분지을 수 있게 하였다.



-결과-


LIST

'Programming > Java' 카테고리의 다른 글

Java - for문  (0) 2015.12.06
Java - 2차원 배열  (0) 2015.12.06
Java - 배열  (0) 2015.12.05
Java - Switch~case문  (0) 2015.12.05
Java - if문, if ~ else if문  (0) 2015.12.05

<배열이란?>

같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열이라 한다.

예를 들어 숫자 다섯개를 저장하고 싶은 변수를 만들고 싶을때,

int num1, num2, num3, num4, num5;이렇게 선언후 각각 변수에 저장하면 된다.

이럴 경우 변수의 개수가 많아지면 불편하므로 이것을 배열로 선언해준다.

int [] num = new int[5];

int [] num : 이 부분은 배열을 선언한 것이다.

new int[5] : 이 부분이 배열을 생성한 것이다.

종합적으로 설명하면 배열을 선언하여 배열의 주소를 저장할 수 있는 num을 만들어 new int[5]으로 변수 5개를 만드는 배열을 생성한 후, 이 시작주소를 num에 저장한다.

이상하지 않는가? C언어에서의 배열과는 전혀 다르다... java에서는 배열자체도 객체로 생성되어 관리 된다. 그러므로 배열의 길이나 크기를 알 수 있는 다양한 메소드도 사용할 수 있다. (나중에 실습에서 확인하자)

지금 num 배열은 모두 0으로 초기화가 되어있다.

 

배열의 초기화 방법 1)

num[0] = 10;

num[1] = 20;

num[2] = 30;

... 이런식으로 초기화 해주면 된다.

 

배열의 초기화 방법 2)

int[] num = {10, 20, 30};

 

배열의 초기화 방법 3)

int[] num = new int[] {10, 20, 30};

 

<실습 1>

숫자 5개를 배열로 입력받아 for문으로 간단하게 합계와 평균을 구하였다.

이때 배열의 메소드 num.length를 사용해 간단하게 배열의 길이를 구하였다.



-결과-



<실습 2 - 버블 정렬>

버블정렬 기법을 통해 배열로 숫자를 나열한 후, 크기순으로 정렬하는 코드를 짜보자.



-결과-


LIST

'Programming > Java' 카테고리의 다른 글

Java - 2차원 배열  (0) 2015.12.06
Java - Scanner, BufferedReader의 차이점과 개념  (0) 2015.12.05
Java - Switch~case문  (0) 2015.12.05
Java - if문, if ~ else if문  (0) 2015.12.05
Java - 삼항 연산자  (0) 2015.12.05

+ Recent posts