'자바'에 해당되는 글 4건

  1. 2014.04.07 [Java] 09. 상속, 추상클래스, 인터페이스
  2. 2014.04.06 [Java] 08. 상속
  3. 2014.04.04 [Java] 06. 객체지향(1)
  4. 2014.04.01 [Java] 04. 배열(1)
  • 인터페이스 (Interface)
    • 클래스에 필요한 메소드들에 대한 약속.
    • 어떤 기능이 있어야한다. 라고만 정하고 그 메소드가 어떻게 돌아가는지는 상관 없음.
    • 그저 스펙을 정의.

  • 추상클래스 (Abstract class)
    • 클래스의 용도가 객체 생성 용도로 사용하지 않는 경우에 사용함.
    • 클래스의 객체 생성의 용도가 아니라면 변수의 타입으로 선언하는 용도와 상속의 본연의 기능으로 특정한 코드를 하위 클래스로 물려주는 기능을 활용할 때 사용함.
    • 객체를 생성하지는 않으나 변수 선언 용도로 사용됨.
    • 상속의 고유 기능인 하위 클래스에 같은 데이터와 기능을 가지도록 물려주는 기능

  • 상속 (Inheritance)
    • 특정 클래스를 구성할 때 기존 클래스의 데이터(속성)와 메소드를 상위(부모) 클래스에서 그대로 물려받아서 중복적인 코드를 줄인다는 장점.
    • 하나의 변수 타입으로 여러 종류의 객체를 의미하는 추상화된 방식의 프로그램이 가능하게 하는 객체지향 기법

  • 인터페이스 vs 추상클래스
    • 공통점
      • 추상 메소드를 가진다.
      • 객체 생성이 불가능하고 타입으로만 사용됨.
    • 차이점
      • 인터페이스는 스펙이나 원하는 기능을 정의하고자 쓰지만, 추상 클래스는 ‘상속+약간의 강제성이 목적’이다.
      • 인터페이스는 상수, 추상 메소드만 존재하지만, 추상클래스는 상속이 원래 목적이므로 실제 변수나 메소드를 그대로 가지고 있다.
      • 인터페이스는 부채만 남겨주지만, 추상 클래스는 재산도 남겨준다.
      • 인터페이스는 다중 상속(?)도 가능하지만, 추상 클래스는 단일 상속만 가능.


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

[Java] 10. 자료구조  (0) 2014.04.08
[Java] 08. 상속  (0) 2014.04.06
[Java] 07. 객체지향(2)  (0) 2014.04.04
[Java] 06. 객체지향(1)  (0) 2014.04.04
[Java] 05. 배열(2)  (0) 2014.04.03
Posted by 믐믐믐믐믐
,

  • 자바 프로그래밍에서 '상속'을 설명할 때 주로 재활용, 재사용이라는 말을 많이 한다. 재사용은 객체 지향적인 프로그래밍에서 얻을 수 있는 큰 이점 중 하나인데 상속은 어떤 기존의 클래스의 특징을 그대로 재사용하여 다른 클래스를 만들 수 있게 해주는 기법으로써 코드를 재사용할 수 있는 기법이다.

  • 상속의 구현은 만약 Bullet이라는 클래스가 있고 이 Bullet의 특성을 물려받는 다른 종류의 Bullet, 예를들어 LightBullet 클래스를 만든다고 하면 

class LightBullet extends Bullet{

//...

}

과 같이 자식클래스 명 옆에 'extends  조상클래스명'을 써주는 것으로 가능하다.

이때, 두 클래스는 상속관계에 있으며
    Bullet 클래스는 상속을 해주는 클래스이며, 조상 클래스, 부모 클래스, 상위 클래스 등과 같이 부르고 
    LightBullet 클래스는 상속을 받는 클래스이며, 자손 클래스, 자식 클래스, 하위 클래스 등과 같이 부른다.


  • 다음은 총을 쏘는 Gun 클래스, 총알인 Bullet 클래스, Bullet 클래스를 상속받은 다른 종류의 총알인 BombBullet 클래스, LightBullet클래스로 구성된 예제이다.

package BulletEx;
public class Gun {
	private Bullet[] bullets; //총알이 담길 Bullets배열 생성.
	private int index;

	public Gun(Bullet[] bullets) {
		super();
		this.bullets = bullets;
	}

	public Bullet fire() {
		return bullets[index++];
	}

	public static void main(String[] args) {

		Bullet[] arr = new Bullet[20];

		for (int i = 0; i < arr.length; i++) {
			if (i % 5 == 0) {
				arr[i] = new LightBullet();
				continue;
			}
			if (i % 6 == 0) {
				arr[i] = new BombBullet();
				continue;
			}
			arr[i] = new Bullet();
		}

		Gun gun = new Gun(arr);

		for (int i = 0; i < 20; i++) {

			Bullet bullet = gun.fire();

			bullet.effect();

		}
	}
}

package BulletEx;
class Bullet {
	public void effect() {

		System.out.println("탕탕탕");

	}
}

package BulletEx;

public class LightBullet extends Bullet { 

	@Override
	public void effect() {
		System.out.println("------------------------");
		super.effect(); // bullet에 있는 effect를 한 번 호출해주고 내려온다 super 은 상속받은 곳 안에서만
						// 쓸 수 있음
		System.out.println("번쩍번쩍");
		System.out.println("------------------------");
	}
}

package BulletEx;

public class BombBullet extends Bullet {

	@Override
	public void effect() {
		// TODO Auto-generated method stub
		System.out.println("------------------------");
		super.effect();
		System.out.println("펑펑펑");
		System.out.println("------------------------");
	}

}


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

[Java] 10. 자료구조  (0) 2014.04.08
[Java] 09. 상속, 추상클래스, 인터페이스  (0) 2014.04.07
[Java] 07. 객체지향(2)  (0) 2014.04.04
[Java] 06. 객체지향(1)  (0) 2014.04.04
[Java] 05. 배열(2)  (0) 2014.04.03
Posted by 믐믐믐믐믐
,
  • 자바는 흔히들 객체지향 프로그래밍(Object-Oriented Programming, OOP) 언어라 부른다.

    객체지향은 우리가 알고 있는 대표적인 프로그래밍 언어인 C가 비교적 명령어의 목록으로 구성되는 것과 달리 컴퓨터 프로그램을 여러 객체들의 모임으로 바라보는 것이다. 이때 객체는 서로 메시지를 주고받고 데이터를 처리한다.

    처음 객체지향이라는 것을 접했을 때는 평소 잘 쓰이지 않는 단어인 객체라는 것에 대한 이해가 정말 어려웠고 아직까지도 누군가 객체가 뭐냐고 물어봤을때 확신을 가지고 설명하기엔 부족함이 많다. 다만 지금까지 봐온 객체와 관련된 많은 설명중 개인적으로 가장 와닿는 말은 '객체란 메소드와 그에 관련된 변수들을 묶어 놓은 것.'

  • 자바에서 새로운 객체를 생성하는 방법은 다음과 같다.
    • 클래스명 변수명;
    • 변수명 = new 클래스명();
    • 위 문장은 클래스명 변수명 = new 클래스명(); 과 같이 작성 가능하며 앞의 클래스명의 경우 인스턴스의 타입을 나타내는 것이다.

  • 다음은 45개의 후보 공들 중 6개를 뽑는 로또예제이다.
    • 이 예제는 45개 각각의 공들을 만들어 낼 수 있는 LottoBall클래스, 45개의 공들을 만들어 담고 그중 6개의 당첨 공을 뽑아내는 LottoMachine, LottoMachine의 객체를 생성하여 결과를 출력하는 Main클래스로 이루어져 있다.

package Lotto; 
public class Main {
    public static void main(String[] args) {
 
        LottoMachine machine = new LottoMachine(); // LottoMachine객체 생성.
        for (LottoBall balls : machine.selectBalls()) {// 생성된 객체에서
                                                        // selectBalls메소드를 통해
                                                        // balls배열에 결과를 넣고
            System.out.println(balls.num);// 결과 출력.
        }
    }
}

package Lotto;
 public class LottoMachine {
 
    LottoBall[] balls; // LottoBall type의 balls배열 생성. 45개의 로또볼들을 담을 곳.
 
    public LottoMachine() { // 45개의 공을 생성하여 balls배열에 담음.
        balls = new LottoBall[45];
        for (int i = 1; i <= 45; i++) {
            balls[i - 1] = new LottoBall(i);
        }
    }
 
    public LottoBall[] selectBalls() { // 6개의 당첨공을 랜덤함수로 뽑고 중복을 방지하기 위해 ball이
                       // 선택되었던 공인지 확인함.
        LottoBall[] resultBalls = new LottoBall[6];
        for (int i = 0; i < 6; i++) {
            int index = (int) (Math.random() * balls.length);
            LottoBall ball = balls[index];
            if (ball.isSelected()) {
                i--;
                continue;
            }
 
            resultBalls[i] = ball; // 선택되었던 공이 아닐경우 결과 배열에 그 공을 담음.
 
        }// end for
        return resultBalls;
    }
 
}

package Lotto;

public class LottoBall {
	int num; // 공의 번호
	boolean selected; // 중복당첨 방지를 위한 선택되었던 공인지 아닌지 판별 boolean 변수

	public LottoBall(int num) { // 생성될때 공은 자신의 번호를 반드시 가지고 있어야 하므로 생성자 생성.
		super();
		this.num = num;
	}

	public boolean isSelected() { // 공 자기자신이 선택되었던 공인지 아닌지를 알고 있음.
		boolean result = false;
		if (selected == false) {
			result = false;
			selected = true;
		} else {
			result = true;
		}
		return result;
	}
}


  • 다음은 도넛의 면적을 구하는 예제이며 도넛의 바깥원의 넓이에서 안쪽 구멍부분의 넓이를 빼줌으로써 결과를 구하게 된다.

    • 이 예제는 바깥 원과 안쪽 원 객체를 각각 생성할 수 있는 Circle클래스, 생성된 원들의 넓이의 차를 구해 결과적으로 도넛의 넓이를 계산하는 CircleManager클래스, 사용자로부터 바깥 원과 안쪽 원의 반지름을 입력받고 결과를 출력하는 CircleUI클래스, Main클래스로 구성되어있다.

    • 본 예제에서 흥미있는 부분은 각 원들의 넓이를 Circle클래스에서 구한다는 점인데 이는 각 원들이 자기 자신의 반지름 뿐만이 아니라 넓이도 가장 잘 알고있다는 사실을 반영한 것이다. 보통 원의 넓이를 구하는 계산은 CircleManager에서 다뤄야 할 것 같지만 조금 더 생각해보면 각각의 원들은 자신의 넓이를 다른 누구보다 자신들이 가장 잘 알고 있을테다.

package Circle;
 
public class Main {
    public static void main(String[] args) {
        CircleUI ui = new CircleUI();
        ui.calcResult();
    }
}

package Circle;
 
import java.util.Scanner;
 
public class CircleUI {
    CircleManager manager;
    Scanner scanner;
 
    public CircleUI() {
        manager = new CircleManager();
        scanner = new Scanner(System.in);
    }
 
    public void calcResult() {
        System.out.println("outer");
        Double outer = Double.parseDouble(scanner.nextLine()); // 바깥 원의 반지름
                                                                // 입력받음.
 
        System.out.println("inner");
        Double inner = Double.parseDouble(scanner.nextLine()); // 안쪽 원의 반지름
                                                                // 입력받음.
 
        Double result = manager.calcDonutArea(new Circle(outer), new Circle(inner));
        System.out.println(result);// 입력받은 반지름으로 결과출력.
    }
 
}

package Circle;
 
public class CircleManager {
 
    public double calcDonutArea(Circle outer, Circle inner) { // 바깥 원과 안쪽 원의 넓이를
                                                                // 받아서 차이를 통해
                                                                // 도넛의 넓이를 구함.
        return outer.getArea() - inner.getArea();
    }
}

package Circle;
 
public class Circle {
    double radious; // 원의 반지름
 
    public Circle(double radious) {
        super();
        this.radious = radious;
    }
 
    public double getArea() { // 반지름으로 생성될 원의 넓이를 구함. 원의 넓이는 원 객체 자신이 가장 잘 알고
                                // 있다!
        return (this.radious * this.radious) * Math.PI;
    }
}


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

[Java] 08. 상속  (0) 2014.04.06
[Java] 07. 객체지향(2)  (0) 2014.04.04
[Java] 05. 배열(2)  (0) 2014.04.03
[Java] 04. 배열(1)  (0) 2014.04.01
[Java] 03. 반복문  (0) 2014.03.31
Posted by 믐믐믐믐믐
,
  • 배열(Array)은 자바에서 같은 타입의 변수들을 한꺼번에 다룰 수 있게 해준다. 

  • 배열을 선언하는 방법은
    • 타입[] 변수이름;
      • Ex. int[] score;
    • 타입 변수이름[];
      • Ex. int score[];
    • 위 두 가지가 있는데 보통 전자를 많이 사용한다. 

  • 이렇게 선언된 배열을 실제로 생성하기 위해서는 연산자 'new'와 배열의 타입과 크기를 지정해 주어야 한다.
    • Ex. int[] score;
           score = new int[5];
    • 위의 문장은 int[] score = new int[5]; 와 같이 쓸 수도 있다.

  • 다음은 23명으로 이루어진 반에서 4개의 조로 임의로 조편성을 하는 예제 코드이다.

import java.util.Arrays;
 
public class JoPyunSung {
    public static void main(String[] args) {
        // 23명으로 이루어진 반의 멤버들을 담을 member 배열 생성후 메모리에 String타입의 23개의 빈 공간을 생성하고,
        // 4개의 조와 각 조별로 인원이 들어갈 5혹은 6개의 공간을 마련하기위해 다차원 배열 team을 만들어줌.
        String[] member = new String[23];
        String[][] team = new String[4][];
 
        // 4개의 조에 각각 인원수만큼의 공간을 만들어줌.
        team[0] = new String[6];
        team[1] = new String[6];
        team[2] = new String[6];
        team[3] = new String[5];
 
        // member 배열에 23명의 반 인원들의 이름을 넣어줌. 본 예제에서는 임의로 0번 부터 22번까지의 숫자로 이름을 부여.
        for (int i = 0; i < member.length; i++) {
            member[i] = i + "번 사람";
        }
 
        // 반 인원수가 23명이므로 먼저 20명에 대해 랜덤으로 조편성을 해줌.
        // 이때, 중복으로 선택되는 것을 방지하기 위해 조편성이 된 인원에 해당하는 member배열은 x값으로 바꿔줌.
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < team.length;) {
                int k = (int) (Math.random() * 100 % 23);
                if (!member[k].equals("x")) {
                    team[j][i % 6] = member[k];
                    member[k] = "x";
                    j++;
                }
            }
        }
 
        // team[0]부터 team[2]까지 남은 3명의 인원에 대한 조편성 마무리.
        for (int j = 0; j < team.length - 1;) {
            int k = (int) (Math.random() * 100 % 23);
            if (!member[k].equals("x")) {
                team[j][5] = member[k];
                member[k] = "x";
                j++;
            }
        }
 
        // 결과 출력.
        System.out.print("전체: " + Arrays.toString(member));
        System.out.println();
        for (int i = 0; i < team.length; i++) {
            System.out.println(i + 1 + "조: " + Arrays.toString(team[i]));
        }
    }
}

  • 다음은 임의의 6명의 인원에 대한 제비뽑기(등수매기기)예제이다.


import java.util.*;
 
public class ArrayEx1 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner = new Scanner(System.in);
 
        // 제비뽑기 참여 인원 6명의 숫자를 위한 공간과 각각에 해당되는 이름을 위한 String타입의 다차원배열 arr생성.
        // 6은 참여인원 수. 2는 6명 각각의 번호와 이름을 위한 공간.
        String[][] arr = new String[6][2];
 
        // 6개의 공간에 해당 숫자와 이름을 할당.
        for (int i = 0; i < arr.length; i++) {
            arr[i][0] = i + 1 + "번";
            System.out.println(arr[i][0] + " 이름을 입력해주세요.");
            arr[i][1] = scanner.nextLine();
        }
        // 중복방지.
        int[] index = new int[6];
        int[] tmp = { 0, 0, 0, 0, 0, 0 };
 
        for (int i = 0; i < index.length;) {
            int j = (int) (Math.random() * index.length * 120 % 6);
            if (tmp[j] == 0) {
                tmp[j] = 1;
                index[i] = j;
                i++;
            }
        }
 
        // System.out.println(Arrays.toString(index));
        // 결과출력.
        for (int i = 0; i < arr.length; i++) {
            System.out.println(Arrays.toString(arr[i]) + (index[i] + 1) + "등");
        }
    }
}

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

[Java] 06. 객체지향(1)  (0) 2014.04.04
[Java] 05. 배열(2)  (0) 2014.04.03
[Java] 03. 반복문  (0) 2014.03.31
[Java] 02. 제어문  (0) 2014.03.31
[Java] 01. 자료형  (0) 2014.03.31
Posted by 믐믐믐믐믐
,