Java언어의 모든 클래스의 super class인 java.lang.Object 클래스에 대해서 설명합니다.



반응형
LIST

import에 대해서 설명합니다.



반응형
LIST

Package에 대해서 설명합니다.



반응형
LIST

Interface에 대해서 설명합니다.



반응형
LIST

Abstract class에 대해서 설명합니다.



반응형
LIST

상속관련한 예제 문제입니다.





4_활동지_상속.pptx



반응형
LIST

클래스 정의와 관련된 예제 문제입니다.



3_활동지_클래스정의_without_답.pptx


반응형
LIST

Method overriding에 대해 실습합니다.



반응형
LIST
Java언어의 method overriding의 개념에 대해 설명합니다.


반응형
LIST

instanceof 연산자에 대해 설명합니다.



반응형
LIST
상속과 관련있는 캐스팅인 업캐스팅(upcasting)과 다운캐스팅(downcasting)에 대해 설명합니다.



반응형
LIST
상속에서 사용되는 생성자를 실습합니다.


반응형
LIST
상속환경에서 접근지정자와 생성자가 어떻게 사용되는지 설명합니다.


반응형
LIST
상속의 특징을 설명하고, 접근지정자가 상속과 함께 어떻게 사용되는지 설명합니다.


반응형
LIST


상속 (Inheritance)의 구현

상속은 객체기반 프로그래밍을 아주 쉽게 해주는 즐거운 도구이다.
쉽게 한마디로 설명하자면,
새로운 클래스를 만들 때, 기존 클래스를 확장시켜서 만드는 것이다.
예를 들어,
학교에 본관건물이 하나만 있었다고 하자. 
확장하기 위해서 강당을 하나 지으면,
이제 학교는 본관+강당이 되는 것이다.
상속도 유사한 원리로 진행된다.

class Point

이 클래스는 2차원 공간 위의 점을 하나 나타낸다고 하자.
멤버변수 x, y는 좌표 (x,y)를 나타내고,
멤버메소드 showPoint( )는 좌표 (x,y)를 출력한다. 
public class Point
{
   int x;
   int y;
   public void showPoint()
   {
      System.out.println(x+","+y);
   }
}

이제 점을 나타내는 새로운 클래스를 만들고자 한다.
좌표값 외에도, 점의 색깔에 대한 정보도 넣고 싶다.
이 경우, class Point를 확장해서 만들면 아주 쉽다.
추가로 점의 색깔에 대한 정보, 그리고 색깔을 가지고 동작하는 메소드만 
만들면 되는 것이다.

우선, 새로 만드는 클래스 이름을 ColorPoint라고 하고,
class Point를 확장해서 만들어보자.
이를 Java언어로 구현하면 다음과 같다.
public class ColorPoint extends Point
{
   .......
}
'extends'는 Java언어의 예약어이다.
class Point를 확장해서, ColorPoint를 만든다는 의미이다.

상속: 이것은 확장과 동일한 의미이다.
위에서 class Point를 확장해서 (extends) ColorPoint를 만드는 것은,
결국,  Point의 멤버 변수와 메소드들을 모두 상속받아서
사용하겠다는 것과 같은 뜻이다.

class ColorPoint 

이것은 class Point를 확장(상속)했기 때문에,
기본적으로 멤버 변수 x, y 그리고 멤버 메소드 showPoint( )를 
가지고 있다.
이를 그림으로 표현하자면 다음과 같다.


추가 멤버변수와 메소드


class ColorPoint에 점 색깔에 대한 정보를 넣는 것은
아래와 같다.

public class ColorPoint extends Point
{
   public String colorName;
   public void showColor()
   {
      System.out.println("The color of the point is "+colorName);
   }
}
위의 코드에서는
점색깔을 String 타입의 멤버변수 colorName으로,
그리고 메소드로 그 색깔을 출력하는 showColor()를 추가하였다.

class ColorPoint의 객체 생성과 사용

상속받아 만든 클래스로부터 객체를 생성하는 것은
이전과 다름이 없다.
대신 신기한 것은 직접 정의하지 않은 멤버변수와 메소드들을
마치 자기 것인야 쓸 수 있다는 것이다.
ColorPoint cp = new ColorPoint();

cp.x = 10;
cp.y = 20;
cp.showPoint();

cp.colorName = "Red";
cp.showColor();

위의 코드에서 볼 수 있듯이
멤버 변수 x와 y, 메소드 showPoint( )는 ColorPoint가 정의하지는 않았지만,
상속받았기에 마치 자기 것 처럼 쓰고 있다.

위의 내용을 동영상에서 자세히 설명하고 있습니다. 


반응형
LIST
객체지향언어 Java의 핵심개념인 상속 (inheritance)에 대해 설명합니다.



반응형
LIST
static 지정자에 대해 실습을 통해 알아보고, final 지정자에 대해 설명합니다.



반응형
LIST
접근지정자에 대해 실습하고 static 지정자에 대해 설명합니다.



반응형
LIST
접근지정자에 대해 상세하게 설명합니다.



반응형
LIST
Java Virtual Machine의 메모리 관리 기능인 garbage collection과 클래스 멤버에 대한 접근지정자에 대해 설명합니다.


반응형
LIST
클래스 생성자, (class constructor)에 대해 설명합니다.


반응형
LIST
클래스 (Class)를 사용하는 방법에 대해서 알아봅니다.


반응형
LIST



클래스 정의

객체기반 프로그래밍의 순서는 간단히 2단계로 이루어진다.
1. 필요한 클래스들을 정의한다.
2. 클래스들로부터 객체를 만들어내서 조합하여 원하는 프로그램을 만든다.

Java언어에서 클래스를 정의하는 것에 대해 알아보자.

Person이라는 클래스를 만든다고 하자.
우선 아래와 같이 쓴다.
맨 앞의 public은 접근지정자 (access modifier)라고 하며,
'public'은 Person 클래스를 다른 사람들도 사용할 수 있도록 하겠다는 것이다. 
클래스 정의는 { 과 } 사이에 기입해 넣으면 된다.
public class Person
{

}

이제 클래스 안에 넣을 데이터를 지정해야 한다.
이 데이터를 '클래스 멤버변수 (member variable)이라고 한다.
Person이라는 정보이므로 사람의 나이와 성별을
각각 age와 isFemale 멤버변수에 저장한다고 하자.
isFemale 변수의 경우, true이면 여자이고, false이면 남자를 나타낸다고 하자.
'private'도 'public'과 마찬가지로 접근지정자의 일종이다.
이것의 의미는 클래스 외부에서는 이 멤버변수들을 읽거나 쓸 수 없다는 뜻이다.
public class Person
{
   private int age;
   private boolean isFemale;
}

클래스 안에는 데이터 외에도, 동작에 해당하는 멤버메소드(member method)들을
지정할 수 있다.
여기서는 나이를 출력하는 동작을 하는 메소드와
남자 혹은 여자인지를 출력하는 동작을 하는 메소드를 구현해 넣어보겠다.
public class Person
{
   private int age;
   private boolean isFemale;

public void showAge() 
{
   System.out.println("My age is "+age);
}

pubic void showGender()
{
   if (isFemale == true) 
   {
      System.out.println("I am female.");
   }
   else
   {
      System.out.println("I am male.");
   }
}
}
먼저 showAge( )메소드를 살펴보자.
'public'은 앞서 설명한 대로 접근지정자이고,
클래스 외부에서 이 메소드를 호출할 수 있다는 뜻이다.
이 메소드는 멤버변수 age의 값을 단순 출력하는 역할을 한다.
그리고,
showGender( ) 메소드를 보면,
멤버변수 isFemale의 값에 따라 성별을 출력하는 역할을 한다.
이것 역시 'public' 접근지정자를 갖는다.

생성자(Constructor)의 정의

클래스의 이름, 멤버변수, 멤버메소드 들을 정의하면
어느 정도 클래스가 모양새를 갖추게 된다.
한가지만 더 추가하면 거의 완벽한 클래스 정의가 된다.
그것은 바로 생성자이다.

생성자는 클래스로부터 객체를 만들어 내는 역할을
하는 특수 메소드이다.
생성자의 이름은 클래스 이름과 같고,
반환형이 없다.
그러나 함수의 인수는 가질 수 있다.
생성자 역시 클래스 정의 안에 만들어야 한다.

public class Person
{
   private int age;
   private boolean isFemale;

   public Person() // constructor 1
   {
   }

   public Person (int _age, boolean _isFemale)
   {
      age = _age;
      isFemale = _isFemale;
   }

public void showAge() 
{
   System.out.println("My age is "+age);
}

pubic void showGender()
{
   if (isFemale == true) 
   {
      System.out.println("I am female.");
   }
   else
   {
      System.out.println("I am male.");
   }
}
}
위에서 2개의 생성자를 정의했다. (빨간 색으로 표시했다.)
하나는 default 생성자(위의 것)이고, 다른 하나는 인수를 갖는 생성자이다.
default 생성자란 아무런 인수를 받지 않는 생성자를 말한다. 
특히, 클래스 안에 생성자를 굳이 만들지 않을 경우에라도 자동으로 만들어지는 생성자이다. 
(자동이라는 의미는 없어도 있는 것처럼 행동한다는 뜻이다. 클래스 정의 안에 저절로 입력된다는 뜻은 아니다.)
다만, default 생성자 외에 다른 생성자를 만들면, 반드시 default 생성자를 만들어야 하는 규칙이 있다.
두 번째 생성자는 두 개의 인수를 받아서,
멤버변수들을 초기화하고 있다.
객체를 생성하기 위해서는 필요에 따라 이들 두 생성자 중에 선택해서 사용하면 된다.
또한 필요한 경우, 생성자를 더 추가해서 만들어도 된다. 


클래스로부터 객체를 생성

이제 Person 클래스 정의를 이용해서 객체를 만들어서
사용하는 방법을 알아보자.
Person p1 = new Person();
Person p2 = new Person(20, true);

위에서는 두 개의 객체, p1과 p2를 만들고 있다.
'new'라는 것은 객체를 만드는 역할을 한다.
이 때 생성자가 사용되었다.
위의 것은 default 생성자를 사용했고,
아래 것은 두 개의 인수를 받는 생성자를 사용했다.

객체의 사용

이제 p1과 p2의 객체를 사용하는 예를 보자.
p1.showAge();
p2.showGender();
객체에다가 '.'을 붙이고 메소드 이름을 쓰면
해당 메소드를 호출하는 것이 된다.
메소드 showAge( )와 showGender( )는 접근 지정자가 'public'이므로
클래스 밖에서 호출이 가능한 것이다.

반면에, 멤버변수 age와 isFemale은 객체를 통해서 접근이 불가하다.
왜나햐면 'private' 접근지정자를 사용하고 있기 때문이다.
접근을 허용하려면 'public'으로 바꾸어야 한다.

이상에서 클래스를 정의하는 방법과 객체를 생성하여 사용하는 방법에 대해
쉬운 예를 들어 알아보았다.
복잡한 예들도 많지만 위에서 설명한 기본 골격을 잘 알아두면
크게 어렵지는 않다.

위의 내용을 동영상으로 설명합니다. 


반응형
LIST
Java언어의 핵심개념인 클래스 (class)에 대해 설명합니다.






반응형
LIST


Exception (예외) 

Java 프로그램이 수행되는 중에 오류 (error)가 발생하면
이것에 대한 정보를 담은 객체가 만들어지는데, 이것을 Exception 이라고 한다.

이러한 Exception은 크게 둘로 나누어진다.
1. Checked Exception
2. Unchecked Exception

Checked Exception

오류가 발생했을 때, 프로그램이 수행을 포기하지 않고도
복구할 수 있는 방법을 찾을 수 있는 Exception을 말한다.
예를 들어, 사용자가 파일이름을 지정하면, 그것을 열어서 동작하는 프로그램이라고
가정하자. 만약, 존재하지 않는 파일이름을 지정하면, 파일을 열 수 없기
때문에 오류가 발생한다. 
하지만, 사용자에게 오류를 알리고 다시 파일이름을 지정하라고 하여
복구할 수 있다.

여기에 해당하는 Exception에는
FileNotFoundException 같은 것이 있다.
여기에 대해서 나중에 더 자세히 설명한다.

Unchecked Exception
오류가 발생하면, 프로그램이 수행을 포기해야하거나, 
원래 목적했던 바를 이룰 수 없는 Exception을 말한다.
이것은 크게 둘로 나누어 ErrorRuntimeException이 있다.

Error는 프로그램 외적인 요인으로부터 생긱는 오류이다.
파일 읽기를 하는 프로그램이 수행 중 하드디스크가 하드웨어적으로 고장난 경우가
여기에 해당한다.

RuntimeException은 프로그램 수행 중에 논리 오류에 의해
일어나는 상황을 말한다. 예를 들어 나누기를 하는데 0으로 나누거나,
배열 인덱스를 사용할 때, 범위를 벗어나는 값을 사용하는 경우이다.
전자를 ArithmeticException, 후자를 ArrayIndexOutofBoundsException이라고 한다.

Arithmetic Exception예제

아래 프로그램은 0으로 나누는 연산이 들어가는 프로그램이다.

실행 중에 ArithmeticException이 발생하는 것을 알 수 있다.

ArrayIndexOutOfBoundsException 예제


이번에는 배열의 인덱스가 범위를 넘어가는 경우에 대한 예제이다.

아래 프로그램에서 인덱스는 0~2까지 이지만,

line 8에서 3을 사용하고 있다. 

프로그램을 실행하면 ArrayIndexOutOfBoundsException 이 발생함을 알 수 있고,

관련 정보들, 인덱스 3이 사용되었고, 그것이 line 9 임을 표시하고 있다.


Checked Exception 처리를 위한 try-catch문


<< 작성 예정 >>



Java프로그램 실행 중 발생하는 오류(Exception)을 처리하기 위한 try-catch 문에 대해 설명합니다.






반응형
LIST

다차원 배열 (Multi dimensional array)

2차원 이상의 배열을 다차원 배열이라고 한다.
행렬 같은 것을 생각하면 2차원 배열을 쉽게 이해할 수 있고,
입체공간을 생각하면 3차원 배열이 머리속에 그려질 것이다.

2차원 배열의 선언

1차원 배열과 비슷하지만, 배열을 나타내는 [] 표시를
하나 더 사용해서 아래와 같이 나타낸다.
int[][] a = new int[3][3];

2차원 배열선언과 동시에 값을 할당하는 것은 아래와 같이 한다.

눈여겨 볼 것은, 2차원 배열이기 때문에 행별로 { }로 감싸서 표시해야 하다.

만약, { } 표시를 하지 않을 경우에는 다음과 같이 컴파일 오류로 표시된다.


선언된 2차원 배열의 각 요소에 접근하는 것은 for-loop을 2번 중첩하면 된다.



2차원 배열의 길이


2차원 배열의 길이는 1차원 배열과는 조금 다르다.

예를 들어 아래와 같은 3x3 배열을 예를 들어보자.

전체적인 공간은 9개이다.


int[][] a = new int[3][3];


하지만, a.length는 행의 개수를 의미하여, 3이 되다.

전체 공간의 개수 9가 아님에 유의하자.

각 행에 들어있는 열의 개수는 각 행별로 확인해야 한다.

예를 들어, 0번 행의 경우에는 a[0].length와 같다.

아래는 2차원 배열에 .length를 사용했을 때의 출력결과를 보여준다.


이렇게 되는 이유는 아래 그림을 보면 다소나마 쉽게 이해할 수 있다.

a.length는 a안에 있는 요소의 개수 이므로 3이 되고,

a[0].length는 그 안에 있는 요소의 개수이므로 3이 되는 이치이다.




3차원 배열의 선언


2차원배열 보다 [] 를 하나 더 붙이면 3차원 배열을 만들 수 잇다

이것을 그림으로 표시해 보면 아래와 같은 입체를 생각해볼 수 있다.

모두 12개( = 3*2*2)의 사각형으로 구성된 입체이다. 

3차원 배열에 대한 초기화는 조금 신경써서 해야 한다.

c[3][2][2]의 경우에,

우선 { }으로 3등분을 한다.

그리고, 각 { }안에서, { }으로 다시 2등분을 한다.

가장 안 쪽의 { }안에, 숫자 2개씩을 쓰면 된다.

이것을 그림으로 보여주면 아래와 같다.


실제로 초기화 한 예는 아래와 같다.


그리고, 3차원 배열의 각 요소를 접근하는 것은 

2차원 배열과 마찬가지지만, for-loop을 한 번 더, 즉 3번을 중첩하여야 한다.



3차원 배열의 길이


위에서 2차원 배열의 길이를 설명했다.

3차원 배열의 길이도 아래 그림과 같은 의미를 같는다. 

배열 이름에다가 .length를 붙이면, 가장 큰 그룹의 개수를 의미하며,

차원이 하나씩 들어갈 수록 그 안에 있는 서브그룹의 개수들을 의미하게 된다.


아래 그림에서 a.length는 가장 큰 그룹의 개수이므로 3이 되고,

a[0].length는 그 안에서의 서브그룹의 개수이므로 2,

마지막으로 a[0][0]는 또 다시 그안에서의 서브그룹의 개수이므로 2가 되는 것이다.

따라서, 전체 공간의 개수를 알려면 각 단계별 개수를 모두 곱한 값이 된다.


3차원 배열의 크기를 출력해 보는 아래 예제를 살펴보자.

c는 3*2*2 크기를 갖는 3차원 배열이다.

이 때, c.length는 가장 큰 그룹의 개수를 의미한다.

그리고 c[0]은 0번째 그룹 안에서의 서브그룹의 개수, 2를 의미한다.

마지막으로 c[0][0]는 가장 안쪽 그룹에 있는 숫자의 개수이므로 2가 된다.




위의 내용을 동영상에서 보다 자세하게 설명합니다. 


반응형
LIST

배열 (Array)

배열선언
Java언어에서 배열을 사용하는 것은 2단계로 이루어진다.

예를 들어, 크기가 3인 int 배열 a를 선언한다고 가정해 보자.
1단계로, 배열을 가리킬 수 있는 변수 a부터 만들어야 한다.
int[] a; 
int[]는 int 배열형을 나타낸다.
여기에서 주의할 것은, a는 배열이 아니라는 것이다.
이것은 단지 배열을 가리킬 수 있는 변수일 뿐이다.
C언어와 비슷하게 다음과 같이 a를 선언해도 되지만,
그리 추천하지는 않는다.
int a[];
왜냐하면, 위의 표기 방식이 "int 배열형의 변수 a"라고 
보다 자연스럽게 읽히기 때문이다.
 
2단계로는 크기 3인 int배열을 만들고, 그 배열을 a로 하여금
가리키게 하는 것이다. 
a = new int[3];
new int[3]은 실제로 크기 3인 배열을 생성한다.
이 때 이것을 a에 대입하게 되면, 그 다음부터는 
a를 이용해서 이 배열에 읽고 쓸 수 있게 된다.

배열에 값을 쓰는 것은 다음과 같다.
a[0] = 10;
a[2] = 20;
C언어의 배열 사용하는 방법과 동일하다.
그리고 index를 사용할 때의 주의 점도 똑같다.
index는 0부터 시작하고, 크기 n보다 하나 작은 n-1까지 사용이 가능하다는 것이다.

또다른 배열선언 방법
위에서는 2단계로 나누어 배열을 선언하는 방법에 대해
설명했다.
하지만 이것은 아래와 같이 1단계로도 가능하다.
int[] a = new int[3];


배열의 초기화

배열을 선언함과 동시에 원하는 값들로 초기화시킬 수도 있다.

이것은 아래와 같이 할 수 있다.

int[] a = {1, 2, 3, 4, 5};

이것은 크기 5인 int배열을 만들고, 

값들로 1, 2, ..., 5를 채운 후, 변수 a에 대입한 것이다.


배열 각 요소에 순차접근

배열이 만들어지면, 그 요소들에 대해 순차적인 접근을 하기 위해서는

반복문을 이용하면 된다.

이를 위해서, for, while, do-while loop등을 이용할 수 있다.

int[] a = new int[3];

for (int i = 0; i < 3; i++)

{

   a[i] = i;

}


int[] a = {1, 2, 3};

int i = 0;

while (i < 3) 

{

   System.out.println(a[i]);

   i++;

}


for each 문

Java 언어는 배열요소들에 대한 순차접근 방법을 위해

'for each' 문을 제공한다.

위의 예제코드는 아래와 같이 for each문을 이용하여 구현될 수 있다.

int[] a = {1, 2, 3};

for (int i: a)

{

   System.out.println(i);

}

분석해 보면, 아래 그림과 같이,

변수 i에는 반복문이 실행될 때마다, a[0], a[1], a[2],... 이런 식으로

순차적으로 값이 바뀌게 된다.

따라서 위 프로그램은 결과적으로 배열 a에 들어있는 값을 순차적으로 출력하게 된다.



배열의 길이

배열의 길이는 배열 안에 저장할 수 있는 공간의 개수와 같다.

배열을 선언할 때 크기로 지정하는 값이 바로 길이라고 할 수 있는데,

이것은 배열의 이름에 .length 를 붙여서 알 수 있다. 

아래 프로그램에서 크기가 10인 배열 m을 선언하고,

각 요소마다 값을 지정하는 프로그램에서, 배열의 크기를 m.length로 지정하였다.



자세한 설명

위의 내용을 동영상에서 보다 자세한 예를 들어 설명합니다. 



반응형
LIST

java.util.Scanner 클래스: 키보드로부터 입력받아들이기.

키보드로부터 입력되는 값을 받아야 할 경우에는
java.util.Scanner 클래스를 이용하면 편하다.

이것을 사용하여 
키보드 입력하는 두 개의 숫자를 받아 들이고,
이 중에서 큰 값을 출력하는 프로그램은 아래와 같이 
작성할 수 있다.





자세한 설명.
위의 내용을 동영상에서 자세히 설명합니다.


반응형
LIST
입력을 받기위한 InputStreamReader 클래스에 대해 설명합니다.


반응형
LIST

Typecasting에 대해서 설명합니다.



반응형
LIST

+ Recent posts