1. 상속

- 부모 클래스에 정의된 멤버 변수, 메소드를 자식 클래스가 물려 받음

- class 자식 extends 부모 { }

class Car {
    int speed;
    public void setSpeed(int Speed) {
        this.speed = speed;
    }
}

public class EletricCar extends Car {
    int battery;
    public void charge(int amount) {
        battery += amount;
    }
}

public class ElectricCarTest {
    public static void main(String[] args) {
        ElectricCar obj = new ElectricCar();
        
        obj.speed = 10;
        obj.setSpeed(60);
        obj.charge(10);
    }
}

 

- 상속 -> 이미 존재하는 클래스의 필드와 메소드 재사용 -> 중복되는 코드 줄일 수 있음

 

2. 자바 상속의 특징

- 다중 상속 지원하지 않음 (여러 개의 클래스로부터 상속 X)

- 다단계 상속은 가능 (A / B extends A / C extends B)

- 상속의 횟수에는 제한 없음 (자식 클래스의 개수 상관 X)

- 상속 계층 구조의 최상위에는 java.lang.Object 클래스가 있음

    - 모든 클래스의 부모 클래스

    - toString( ) 메소드

- 다른 패키지의 클래스도 상속 가능 (패키지.클래스 import 필요)

 

class Animal {
    int age;
    void eat() {
        System.out.println("먹고 있음 ... ");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("짖고 있음 ...");
    }
}

public class DogTest {
     public static void main(String[] args) {
         Dog d = new Dog();
         d.bark();
         d.eat();
     }
 }
 
 // 짖고 있음 ...
 // 먹고 있음 ...

 

class Shape {
    int x, y;
}

class Circle extends Shape {
    int radius;
    public Circle(int radius) {
        this.radius = radius;
        x = 0;
        y = 0;
    }
    
    double getArea() {
        return 3.18 * radius * radius;
}

public class CircleTest {
    public static void main(String[] args) {
        Circle obj = new Circle(10);
        System.out.println("원의 중심: (" + obj.x + "," + obj.y + ")");
        System.out.println("원의 면적: " + obj.getArea());
    }
}

// 원의 중심: (0,0)
// 원의 면적: 314.0

 

3. 상속과 접근 지정자

- 자식 클래스는 부모 클래스의 public 멤버, protected 멤버, 디폴트 멤버(같은 패키지에 있는 경우) 상속 받음

- private 멤버는 상속되지 않음!

 

4. 상속과 생성자 

- 자식 클래스의 객체가 생성될 때 부모 클래스의 생성자도 호출됨!

class Base {
    public Base() {
        System.out.println("Base() 생성자");
    }
}

class Derived extends Base {
     public Derived() {
         System.out.println("Derived() 생성자");
     }
 }
 
 public class Test {
     public static void main(String[] args) {
         Derived r = new Derived();
     }
 }
 
 
// Base() 생성자
// Derived() 생성자

 

- 자식 클래스 객체 안에는 부모 클래스에서 상속된 부분이 들어있음

-> 부모 클래스 부분을 초기화하기 위해 부모 클래스의 생성자도 호출됨

 

- 순서) (부모 클래스 생성자) -> (자식 클래스 생성자)

 

5. 명시적인 생성자 호출

- super();  : 부모 클래스의 생성자 호출

class Base {
    public Base() {
        System.out.println("Base() 생성자");
    }
}

class Derived extends Base {
     public Derived() {
         super();
         System.out.println("Derived() 생성자");
     }
 }
class TwoDimPoint {
    int x, y;
    
    public TwoDimPoint() {
        x = y = 0;
    }
    
    public TwoDimPoint(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

class TreeDimPoint extends TwoDimPoint {
    int z;
    public ThreeDimPoint(int x, int y, int z) {
        super(x, y);
        this.z = z;
    }
}

- 이 경우 부모 클래스의 두 생성자 중 TwoDimPoint(int x, int y)가 호출됨

- 인수의 형태에 따라 적절한 생성자 선택

 

6. 묵시적인 생성자 호출

class Base {
    public Base() {
        System.out.println("Base() 생성자");
    }
}

class Derived extends Base {
     public Derived() {
         System.out.println("Derived() 생성자");
     }
 }

- 컴파일러는 부모 클래스의 기본 생성자가 자동으로 호출되도록 함

- 묵시적인 생성자 호출을 하려면 부모 클래스에 기본 생성자(매개 변수가 없는 생성자)가 반드시 정의되어 있어야 함!

 

7. 메소드 오버라이딩

- 자식 클래스가 부모 클래스의 메소드를 자신의 필요에 맞춰 재정의하는 것

- 메소드 이름이나 매개 변수, 반환형은 같아야 함!

 

class Shape {
    public void draw() { System.out.println("Shape"); }
}

class Circle extends Shape {
    @override
    public void draw() { System.out.println("Circle을 그립니다."); }
}

class Rectangle extends Shape {
    @override
    public void draw() { System.out.println("Rectangle을 그립니다."); }
}

class Triangle extends Shape {
    @override
    public void draw() { System.out.println("Triangle을 그립니다."); }
}

public class ShapeTest {
    public static void main(String[] args) {
        Rectangle s = new Rectangle();
        s.draw();
    }
}

// Rectangle을 그립니다.

- Rectangle 클래스의 객체에 대해 메소드가 호출되면 Rectangle 클래스 안에서 오버라이딩된 draw()가 호출됨

- 철자를 잘못 쓰는 경우 컴파일러는 새로운 메소드로 인식하기 때문에 오버라이드가 일어나지 않음

-> @Override 어노테이션을 앞에 붙이면 이러한 경우 오류 발생시키므로 붙이는 것이 좋음!

 

8. 오버라이딩 & 오버로딩

- 오버로딩 (overloading) : 같은 이름을 가진 여러 개의 메소드 작성

- 오버라이딩 (overriding) : 부모 클래스의 메소드를 자식 클래스가 다시 정의하는 것

 

9. 정적 메소드 오버라이드

- 어떤 참조 변수를 통해 호출되는지에 따라 달라짐

class Animal {
    public static void A() {
        System.out.println("static method in Animal");
    }
}

public class Dog extends Animal {
    public static void A() {
        System.out.println("static method in Dog");
    }
    
    public static void main(String[] args) {
        Dog dog = new Dog();
        Animal a = dog;
        a.A();
        dog.A();
    }
}

// static method in Animal
// static method in Dog

 

10. 키워드 super 

- super는 상속 관계에서 부모 클래스의 메소드나 필드를 명시적으로 참조하기 위해 사용됨

- 부모 클래스의 메소드를 오버라이딩한 경우에 super를 사용하면 부모 클래스의 메소드 호출 가능

class Shape {
    public void draw() {
        System.out.println("Shape 중에 하나를 그릴 예정입니다.");
    }
}

class Circle extends Shape {
    @Override
    public void draw() {
        super.draw();              // 부모 클래스의 draw 호출 
        system.out.println("Circle을 그립니다.");
    }
}

public class ShapeTest {
    public static void main(String[] args) {
        Circle s = new Circle();
        s.draw;
    }
}

// Shape 중에 하나를 그릴 예정입니다.
// Circle을 그립니다.

 

11. 다형성

- 오버로딩은 컴파일 시간에서의 다형성 지원

- 메소드 오버라이딩은 실행 시간에서의 다형성 지원

 

- 다형성: 객체들의 타입이 다르면 똑같은 메시지가 전달되더라도 서로 다른 동작을 하는 것

- 동일한 코드로 다양한 타입의 객체를 처리할 수 있는 기법

 

12. 업캐스팅

- 부모 클래스 변수로 자식 클래스 객체 참조 가능! 

- 자식 클래스의 필드와 메소드에는 접근할 수 없음

- 자식 클래스의 부모 클래스 부분만 접근 가능!

- ex) Rectangle 클래스의 x, y (O) // width, height (X)

 

- 부모 클래스로 캐스팅 된다는 것은 멤버의 갯수 감소 의미! (부모 클래스의 멤버만 접근 가능)

- 업캐스팅을 하고 메소드를 실행할때 자식 클래스에서 오버라이딩한 메소드가 있을 경우, 오버라이딩 된 메소드가 실행됨!

 

// ex) Rectangle, Triangle, Circle 등의 도형 클래스가 부모 클래스인 Shape 클래스로부터 상속된 경우

class Shape {
    protected int x, y;      // 모든 도형의 공통 속성인 위치 기준점 (x, y)
    public void draw() { System.out.println("Shape draw"); }
}

class Rectangle extends Shape {
    private int width, height;
    public void draw() { System.out.println("Rectangle draw"); }
}

class Triangle extends Shape {
    private int base, height;
    public void draw() { System.out.println("Triangle draw"); }
}

class Circle extends Shape {
    private int radius;
    public void draw() { System.out.println("Circle draw"); }
}

public class ShapeTest {
    public static void main(String[] args) {
        Shape s1, s2;
        
        s1 = new Shape();
        s2 = new Rectangle();
    }
}
publc class ShapeTest {
    public static void main(String[] args) {
        Shape s = new Rectangle();
        // 업캐스팅
        // s는 Shape 타입, Rectangle 객체 가리킴
        
        Rectangle r = new Rectangle();
        
        s.x = 0;
        x.y = 0;
        //s.width = 100;    -> 오류!
        //s.height = 100;   -> s로 Rectangle의 필드와 메소드에 접근할 수 없음
    }
}

 

- 다운캐스팅: 부모 객체를 자식 참조 변수로 참조하는 것, 명시적으로 해야 함

class Parent {
    void print() { System.out.println("Parent 메소드 호출"); }
}

class Chile extends Parent {
    @Override void print() { System.out.println("Child 메소드 호출"); }
}

public class Casting {
    public static void main(String[] args) {
        Parent p = new Child();   // 업캐스팅: 자식 객체를 부모 객체로 형변환
        p.print();                // 동적 메소드 호출, 자식의 print() 호출
        
        // Child c = new Parent();  -> 컴파일 오류!
        
        Child c = (Child)p;       // 다운캐스팅: 부모 객체를 자식 객체로 형변환
        c.print();                // 메소드 오버라이딩, 자식의 print() 호출
    }
}

// Child 메소드 호출
// Child 메소드 호출

 

13. 업캐스팅 하는 이유

- 공통적으로 할 수 있는 부분을 만들어 간단하게 다루기 위해

- 상속 관계에서 상속 받은 자식 클래스가 몇 개이든 하나의 인스턴스로 묶어서 관리할 수 있기 때문

// 기존
Rectangle[] r = new Rectangle[];
r[0] = new Rectangle();
r[1] = new Rectangle();
 
Triangle[] t = new Triangle[];
t[0] = new Triangle();
t[1] = new Triangle();
 
Circle[] c = new Circle[];
c[0] = new Circle();
c[1] = new Circle();
// 업캐스팅
Shape[] s = new Shape[];
s[0] = new Rectangle();
s[1] = new Rectangle();
s[2] = new Triangle();
s[3] = new Triangle();
s[4] = new Circle();
s[5] = new Circle();

- 하나의 타입으로 묶어 배열을 구성

- 코드량도 훨씬 줄어들고 가독성도 좋아지며 유지보수성도 좋아짐

- 자식 고유의 메소드 실행하려면 다운캐스팅

 

14. 동적 바인딩

- 업캐스팅: 여러 가지 타입의 객체를 하나의 자료구조 안에 모아서 처리하려는 경우에 필요

 

- 도형 클래스 예제) 각 도형을 그리는 방법은 모두 다르기 때문에 종류에 따라 다른 draw() 호출해야 함

- Shape 클래스가 draw() 갖고 있고, 자식 클래스들이 이 draw() 오버라이딩 한 경우

public class ShapeTest {
    public static void main(String[] args) {
        Shape[] arrayOfShapes;         // Shape의 배열 arrayOfShapes[] 선언
        arrayOfShapes = new Shape[3];
        
        // 배열 arrayOfShapes의 각 원소에 객체를 만들어 대입
        // 다형성에 의해 Shape 객체 배열에 모든 타입의 객체 저장 가능
        arrayOfShapes[0] = new Rectangle();
        arrayOfShapes[1] = new Triangle();
        arrayOfShapes[2] = new Circle();
        
        for (int i = 0; i < arrayOfShapes.length; i++) {
            arrayOfShapes[i].draw();
        }
    }
}

// Rectangle draw
// Triangle draw
// Circle draw

 

15. 업캐스팅의 활용

- 메소드의 매개 변수를 부모 타입으로 선언하면 훨씬 넓은 범위의 객체 받을 수 있음

- 부모 클래스에서 파생된 모든 클래스의 객체를 다 받을 수 있음

public class ShapeTest {
    public static void print(Shape s) {
        System.out.println("x= " + s.x + " y= " + s.y);
    }
    
    public static void main(String[] args) {
        Rectangle s1 = new Rectangle();
        Triangle s2 = new Triangle();
        Circle s3 = new Circle();
        
        print(s1);
        print(s2);
        print(s3);
    }
}

 

16. instanceof 연산자

- 변수가 가리키는 객체의 실제 타입 반환

 

17. 종단 클래스와 종단 메소드

- 종단 클래스(final class) : 상속시킬 수 없는 클래스

- 보안상의 이유로 주로 사용

- 서브 클래스에서 재정의 불가

final class String {
    ...
}

class Baduk {
    enum Player { WHITE, BLACK }
    ...
    final Player getFirstPlayer() {
        return Player.BLACK;
    }
}

1. 객체지향 프로그래밍

- 데이터와 함수를 하나의 덩어리로 묶어서 생각하는 방법: 캡슐화

public class Circle {
	double radius;           // data
	String color;            // data
	double getArea() {return 3.14*radius*radius; }   // func
}

 

2. 정보 은닉

- 객체의 외부에서는 내부 데이터와 알고리즘을 볼 수 없게 함

- 공개된 인터페이스를 통해서만 객체에 접근하도록

 

3. 상속

- 이미 작성된 클래스(부모 클래스)를 이어받아서 새로운 클래스(자식 클래스) 생성 가능

- 자식 클래스는 부모의 속성과 동작 물려받음

 

4. 클래스

- 객체에 대한 설계도 (틀)

- 클래스로부터 만들어지는 각각의 객체 -> '인스턴스'

- 하나의 클래스로 여러 인스턴스를 만들어내지만, 인스턴스마다 속성의 값은 다름

public class Circle {
    // 필드
    public int radius;
    public String color;
    
    // 메소드
    public double getArea() {
        return 3.14*radius*radius;
    }
}

 

5. 객체 생성

- 참조 변수 선언

//Type   변수명  
 Circle   obj;

- 객체 생성

//변수       객체의 참조값
  obj = new Circle();

 

public class CircleTest {
    public static void main(String[] args) {
        // 참조 변수 선언
        Circle obj;
        
        // 객체 생성 & 객체의 참조값 -> 참조 변수에 저장
        obj = new Circle();
        
        // 객체의 필드 사용
        obj.radius = 100;
        obj.color = "blue";
        
        // 객체의 메소드 사용
        double area = obj.getArea();
        System.out.println("원의 면적= " + area);
    }
}

 

6. 참조 변수

- 객체 를 참조할 때 사용되는 변수 - 객체의 참조값이 저장되어 있음

- 참조값은 일반적으로 객체의 주소

- 자바에서 모든 객체는 new 연산자를 이용해야 생성됨

public class DeskLamp {
    // 인스턴스 변수 정의
    private boolean isOn;
    
    // 메소드 정의
    public void turnOn()  { isOn = true; }
    public void turnOff() { isOn = false; }
    public String toString() {
        return "현재 상태는" + (isOn == true ? "켜짐" : "꺼짐");
    }
}

public class DeskLampTest {
    public static void main(String[] args) {
        // 객체 생성
        DeskLamp myLamp = new DeskLamp();
        
        // 객체의 메소드 호출
        myLamp.turnOn();
        System.out.println(myLamp);
        myLamp.turnOff();
        System.out.println(myLamp);
    }
}

 

7. 메소드 오버로딩

- 이름이 동일한 여러 개의 메소드 작성 가능

- 매개변수의 수, 타입, 순서 등이 달라야 함

public class MyMath {
    int add(int x, int y)          { return x+y; }
    int add(int x, int y, int z)   { return x+y+z; }
    int add(int x, int y, int z, int w)   { return x+y+z+w; }
    
    public static void main(String[] args) {
        MyMath obj;
        obj = new MyMath();
        System.out.println(obj.add(10, 20));
        System.out.println(obj.add(10, 20, 30));
        System.out.println(obj.add(10, 20, 30, 40));
    }
}

 

8. 생성자

- 객체가 생성될 때 객체를 초기화하는 특수한 메소드

- 중복 정의 가능

class Pizza {
    int size;
    String type;
    public Pizza 90 {
        size = 12;
        type = "슈퍼슈프림";
    }
    
    public Pizza(int s, String t) {
        size = s;
        type = t;
    }
}

public class PizzaTest {
    public static void main(String[] args) {
        Pizza obj1 = new Pizza();
        System.out.println("(" + obj1.type + ", " + obj1.size + ",)");
        
        Pizza obj2 = new Pizza(24, "포테이토");
        System.out.println("(" + obj2.type + ", " + obj2.size + ",)");

 

9. 기본 생성자

- 매개변수 없는 생성자

- 생성자 하나도 정의하지 않으면 컴파일러가 자동으로 기본 생성자 만듦

 

10. this 참조 변수

- 현재 객체 자신을 가리키는 참조 변수

- 컴파일러에서 자동으로 생성

- 생성자에서 매개 변수 이름과 필드 이름이 동일한 경우에 사용

public Circle (int radius) {
    this.radius = radius;
}

 

11. this()

- 다른 생성자 의미

 

12. 접근 제어

- private: 클래스 안에서만 접근 가능

- public: 누구나 접근 가능

- protected: 자식 클래스만 접근 가능

- 접근지정자 x (default) : 동일 패키지 안에서만 접근 가능

 

13. 접근자와 설정자

- 접근자 (getters) 메소드: 필드값 반환

- 설정자 (setters) 메소드: 필드값 설정

 

- 접근자와 설정자 메소드만을 통해 필드에 접근해야 함!

- 설정자에서 매개변수를 통해 잘못된 값이 넘어오는 경우, 이를 사전에 차단할 수 있음

- 필요할 때마다 필드값을 동적으로 계산하여 반환할 수 있음

- 접근자만 제공 -> 읽기만 가능한 필드 만들 수 있음

- Source 메뉴에서 자동 입력 가능

 

class Account {
    private int regNumber;
    private String name;
    private int balance;
    
    // 접근자
    public String getName() {
    	return name;
    }
    
    // 설정자
    public String setName(String name) {
    	this.name = name;
    }
    
    public int getBalance() {
    	return balance;
    }
    
    public int setBalance(int balance) {
    	this.balance = balance;
    }
}

 

14. 객체의 소멸과 가비지 컬렉션

- 객체 삭제 연산자 없음

- 자동 메모리 시스템 사용: 가비지 컬렉션

 

- 가비지 컬렉터: 힙 메모리에서 더이상 필요없는 객체를 찾아 지움

- 가비지 컬렉션 요청 -> 모든 다른 애플리케이션 멈춤 -> JVM이 실행 여부 판단

System.gc;

 

15. 인수전달 방법

- 기본적으로 Call by value

- 객체를 메소드로 전달 -> 객체의 참조값만 복사되어 전달됨

- 참조 변수는 참조값(주소) 갖고 있음

- 배열도 객체 -> 배열 전달은 배열 참조 변수를 복사하는 것

 

public class ArrayArgumentTest {
	public static double minArray(double[] list) {
    	double min = list[0];
        for (int i = 1; i < list.length; i++) {
        	if(list[i] < min) 
            	min = list[i];
        }
        return (min);
    }
    
    public static void main(String[] args) {
    	double[] a = { 1.1, 2.2, 3.3, 4.4, 0.1, 0.2 };
        double[] b = { -2.0, 3.0, -9.0, 2.9, 1.5 };
        double min;
        
        min = minArray(a);
        System.out.println("첫번째 배열의 최솟값= " + min);
        min = minArray(b);
        System.out.println("두번째 배열의 최솟값= " + min);
    }
}

// 0.1
// -9.0

 

16. 정적 멤버

- 여러 개의 객체가 하나의 변수를 공유해야 하는 경우 

-> 이러한 멤버를 정적 멤버 (static member) / 클래스 멤버 (class member) 라고 함 

- 정적 변수: 클래스 당 하나만 생성되는 변수

- 여러 개가 존재할 수 있음, 한개의 static 변수는 한 번 선언됨

 

- 클래스를 통한 접근

Television.count = 100;

 

- 객체를 통한 접근

Television obj = new Televison();
obj.count = 100;

 

- 정적 메소드: 객체를 생성하지 않고 클래스 이름으로 접근해서 사용 가능

public class Math {
	public static double sqrt(double a) {
    	...
    }
}
...
double value = Math.sqrt(9.0);  // 클래스.함수명 으로 사용

 

17. 정적 변수의 활용

- 정적 메소드는 정적 멤버만 사용할 수 있음

class Test {
    int a;              // 인스턴스 변수
    static int b;       // 정적 변수
    
    void sub1() { a = 0; }         // OK
    static void sub2() { a = 0; }  // 오류! 정적 메소드에서는 인스턴스 멤버 사용할 수 없음

- 정적 메소드에서 정적 메소드를 호출하거나 정적 멤버를 사용하는건 가능

- 정적 메소드는 this를 사용할 수 없음

class Test {
    static int a;
    static void sub(int x) { this.a = x; }    // 오류!

 

- main()도 정적 메소드이기 때문에 인스턴스 메소드를 호출할 수 없음

- 정적 메소드는 main()에서 호출 가능!

public class Test {
    public static int cube(int x) {
        int result = x*x*x;
        return result;
    }
    
    public static void main(String args[]) {
        System.out.println("10*10*10은 " + cube(10));   // 정적 메소드 호출
    }
}

 

18. final 키워드

- 필드에 final을 붙이면 상수가 됨

- static과 동시에 사용하는 경우 많음

public class Car {
    static final int MAX_SPEED = 100;
}

- 상수는 클래스 변수로 만들어서 공유하는 것이 메모리 공간 절약

 

19. 싱글톤 패턴

- 객체 중 전체 시스템을 통틀어서 딱 하나만 존재해야 하는 것들이 있음

- ex) 환경설정 클래스, 네트워크 연결 풀 / 스레드 풀을 관리하는 클래스들

- 싱글톤 패턴은 하나의 프로그램 내에서 하나의 인스턴스만을 생성해야 하는 경우에 사용

 

class Single {
    private static Single instance = new Single();   
    private Single() { }      // 전용 생성자
    
    public static Single getInstance() {
        return instance;
    }
}

public class SingleTest {
    public static void main(String[] args) {
        Single obj1 = Single.getInstance();
        Single obj2 = Single.getInstance();
        System.out.println(obj1);
        System.out.println(obj2);
    }
}

 

20. 객체배열

- 객체를 저장하는 배열

- 객체에 대한 참조값 저장

 

class Rect {
    int width, height;
    
    public Rect(int w, int h) {
        this.width = w;
        this.height = h;
    }
    
    double getArea() {
        return (double) width * height;
    }
}

public class RectArrayTest {
    public static void main(String[] args) {
        Rect[] list = new Rect[5];             // 객체 배열 생성
        
        for (int i = 0; i < list.length; i++)
            list[i] = new Rect(i,i);           // 배열에 객체 값 저장 
            
        for (int i = 0; i < list.length; i++)
            System.out.println(i + "번째 사각형의 면적= " + list[i].getArea());
    }
}

/** 
0번째 사각형의 면적= 0.0
1번째 사각형의 면적= 1.0
2번째 사각형의 면적= 4.0
3번째 사각형의 면적= 9.0
4번째 사각형의 면적= 16.0
**/

 

for(int i = 0; i < list.length; i++)
     list[i] = new Rect(i, i);

 

21. 동적 객체 배열

- ArrayList<>

import java.util.ArrayList;

public class ArrayListTest {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("홍콩");
        list.add("싱가포르");
        list.add("괌");
        list.add("사이판");
        list.add("하와이");
        
        System.out.println("여행지 추천 시스템");
        int index = (int)(Math.random()*list.size());
        System.out.println("추천 여행지는 " + list.get(index));
    }
}

- list.add(); 로 추가

 

import java.util.ArrayList;

class Person {
    String name;
    String tel;
    
    public Person(String name, String tel) {
        this.name = name;
        this.tel = tel;
    }
}

public class ArrayListTest2 {
    public static void main(String[] args) {
        ArrayList<Person> list = new ArrayList<Person>();
        list.add(new Person("Anna", "01023459293"));
        list.add(new Person("Jane", "01082983491"));
        list.add(new Person("Jim", "01012349722"));
        list.add(new Person("Emily", "01092938475"));
        for (Person obj : list)
            System.out.println("(" + obj.name + "," + obj.tel + ")");
    }
}

'Software > JAVA' 카테고리의 다른 글

[JAVA] Day6. 추상클래스, 인터페이스, 중첩클래스  (0) 2022.12.29
[JAVA] Day5. 상속  (0) 2022.12.29
[JAVA] Day2. 조건문, 반복문, 배열  (0) 2022.12.27
[JAVA] Day1. 자바 기초  (0) 2022.12.27
[JAVA] 예외처리  (0) 2021.07.22

C언어와 비슷한 문법!

 

1. if-else문

public class Nested {
	public static void main(String[] args) {
    
    	Scanner sc = new Scanner(System.in);
        System.out.print("정수 입력: ");
        int num = sc.nextInt();
        
        if (num > 0)
        	System.out.println("양수");
        else if (num == 0) 
        	System.out.println("0");
        else
        	System.out.println("음수");
            
    }
}

 

2. switch문

- 제어식에 숫자, 문자, 문자열 가능

 

import java.util.*;

public class Score2Grade {
	public static void main(String[] args) {
    	int score, num;
        char grade;
        
        Scanner sc = new Scanner(System.in);
        System.out.print("성적 입력: ");
        score = sc.nextInt();
        num = score / 10;
        
        switch(num) {
        case 10:
        case 9:		grade = 'A';    break;
        case 8:		grade = 'B';	break;
        case 7:		grade = 'C';	break;
        case 6:		grade = 'D';	break;
        default:	grade = 'F';	break;
        }
        System.out.println("학점: " + grade);
    }
}
switch(num) {
	case 10:
	case 9:    return 'a';
    
	case 10, 9 ->    return 'a';
}

// 둘 다 가능

 

3. for문

- for (초기식; 조건식; 증감식) {

   }

public class Sum {
	public static void main(String[] args) {
    	int sum = 0;
        
        for (int i = 1; i <= 10; i++) {
        	sum += i;
        }
        
        System.out.println("1부터 10까지의 정수의 합 = %d" + sum)l     
    } 
}

 

4. while문

- while (조건식) {

  }

import java.util.Scanner;

public class GetSum {
	public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
        
        int sum = 0, value = 0;
        
        while (value != -1) {
            sum += value;
            System.out.print("정수 입력: ");
            value = sc.nextInt();
        }
        System.out.println("정수의 합은 " + sum + "입니다.");
    }
}

 

5. do-while문

- 조건이 참인 동안 do 안의 문장 반복

- 우선 do 문장 한 번 실행하고 조건 확인

import java.util.Scanner;

public class CheckInput {
	public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
        int month;
        do {
            System.out.print("올바른 월을 입력하세요 [1-12]: ");
            month = sc.nextInt();
        } while (month < 1 || month > 12);
        System.out.println("사용자가 입력한 월은 " + month);
    }
}

 

6. break, continue

- break: 반복문을 벗어남

- continue: 해당 반복을 멈추고 다음 반복으로 넘어감

 

7. 무한루프

- while문에서 종료 조건을 만들기 까다로운 경우 while(true)를 이용한 후 그 안에서 break문으로 반복을 빠져나가는 것이 좋음


8. 배열 선언과 사용

- 자바에서 배열은 객체

// 배열 생성
int[] s = new int[10];

// 배열 채우기
for (int i = 0; i < s.length; i++) {
	s[i] = i;
}

// 배열 출력
for (int i = 0; i < s.length; i++) {
	System.out.print(s[i] + " ");
} 
// 0 1 2 3 4 5 6 7 8 9

- 배열의 크기: s.length

// 배열 초기화
int [] scores = {10, 20, 30, 40, 50};

 

9. for-each 루프

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

for (int e : list) {
	System.out.println(e);
}
// 배열 전부 출력

 

10. 2차원 배열

// 2차원 배열 생성
int[][] s = new int[3][5];

// 2차원 배열 초기화
int[][] testArray = {
	{10, 20, 30, 1, 2},
	{40, 50, 60, 3, 4},
	{70, 80, 90, 5, 6}
};

// 2차원 배열 출력
for (int i = 0; i < 3; i++) {
	for (int j = 0; j < 5; j++) {
    	System.out.println(s[i][j]);
    }
}

 

11. 래그드 배열

int[][] ragged = new int[MAX_ROWS + 1][];

for (int r = 0; r <= MAX_ROWS; r++)
	ragged[r] = new int[r+1];

 

public class RaggedArray {
	public static void main(String[] args) {
    	int[][] ragged = new int[3][];
        ragged[0] = new int[1];
        ragged[1] = new int[2];
        ragged[2] = new int[3];
        
        for (int r = 0; r < ragged.length; r++) {
            for (int c = 0; c < ragged[r].length; c++)
            	ragged[r][c] = c;
        }
    }
}

 

12. ArrayList

- 배열의 크기 동적 변경하면서 사용 가능

ArrayList<String> list;    // list: 문자열을 저장하는 ArrayList 참조 변수 선언
list = new ArrayList<>();  // ArrayList 생성

list.add("Apple");
list.add("Grape");
import java.util.*;

public class ArrayListTest {
	public static void main(String[] args) {
    	ArrayList<String> list = new Arraylist<>();
        list.add("Anna");
        list.add("Mike");
        list.add("Joy");
        list.add("Lina");
        for (String obj : list)
        	System.out.print(obj + " ");
    }
}
// Anna Mike Joy Lina

'Software > JAVA' 카테고리의 다른 글

[JAVA] Day5. 상속  (0) 2022.12.29
[JAVA] Day 3-4. 클래스와 객체  (2) 2022.12.29
[JAVA] Day1. 자바 기초  (0) 2022.12.27
[JAVA] 예외처리  (0) 2021.07.22
[JAVA] 객체지향  (0) 2021.07.22

1. 클래스

- 객체 지향 언어의 기본적인 빌딩 블록

public class Name {

}

- 자바 소스파일 (.java) 는 항상 public이 붙은 클래스의 이름과 동일해야 함

- 하나의 소스파일 안에 public 클래스가 2개 이상 있으면 오류 발생

 

2. 메소드

- 특정한 작업을 수행하는 코드의 묶음

public static void main (String[] args) {
	System.out.println("Hello World!");
}

 

3. 자료형

- 기초형

    - 정수형: byte(1), short(2), int(4), long(8)

    - 실수형: float(4), double(8)

    - 논리형: boolean

    - 문자형: char (2, 유니코드)

 

- 참조형: 클래스, 인터페이스, 배열

 

- 리터럴:

    - 소스코드에 직접 쓰여있는 값 (ex, x = 100;)

    - 정수형, 부동소수점형, 문자형 등의 여러 타입 있음

 

- 상수: 프로그램이 실행되는 동안 값이 변하지 않는 수

 

4. 형변환

- 산술 연산 전에 피연산자의 타입 통일해야 함

- 강제 형변환

int x = 3;
double y = (double) x;

 

5. 콘솔에서 입력받기 (Scanner)

- System.in 사용

import java.util.Scanner;
Scanner sc = new Scanner(System.in);

 

- 키보드로부터 바이트 값 받아서 분리자를 이용하여 토큰으로 분리

- default 분리자는 공백문자 (' ', '\n', '\t')

String name = sc.next();           // 한 단어 입력
int age = sc.nextInt();            // 문자열(토큰)을 정수로 변환하여 반환
double weight = sc.nextDouble();   // 문자열을 실수로 변환하여 반환
String line = sc.nextLine();       // 한 줄 입력

 

6. 조건 연산자

'Software > JAVA' 카테고리의 다른 글

[JAVA] Day 3-4. 클래스와 객체  (2) 2022.12.29
[JAVA] Day2. 조건문, 반복문, 배열  (0) 2022.12.27
[JAVA] 예외처리  (0) 2021.07.22
[JAVA] 객체지향  (0) 2021.07.22
[JAVA] 배열  (0) 2021.07.20

출처) 코뮤니티 모각코 "JAVA를 자바" 과정

 

1. 예외처리가 필요할 때

오류에 부딪힐 때 오류를 없애는 것이 가장 좋지만, 모두 없앨 수 없다면 그것을 제대로 처리하는 것도 중요하다.

오류를 무시할 때도 있고, 적절한 조치를 취해야 할 때도 있다.

 

그 때 사용할 수 있는 것이 "try, catch, throw" 등이다.

 

2. try, catch, finally

 

1) try~catch

 

int[] value = new int[3];

value[3] = 10;

 

위 코드를 실행하면 ArrayIndexOutOfBoundsException 오류가 발생한다.

 

오류 발생 시 "오류 발생" 이라는 문장이 출력되도록 코드를 짜면 아래와 같다.

 

int[] value = new int[3];

 

try {

    value[3] = 10;

} catch (ArrayIndexOutOfBoundsException e) {

    System.out.println("오류 발생");

}

 

위 코드를 실행하면 오류 발생 이라는 문장이 출력된다.

이처럼 예외 처리는 try~catch 문으로 할 수 있다.

 

try {
	실행문
} catch(예외1) {
	예외1 발생 시 실행문
} catch(예외2) {
	예외2 발생 시 실행문
}

 

catch (ArrayIndexOutOfBoundsException e) {

    System.out.println("오류 발생");

}

 

이처럼 괄호 안에는 예외처리 할 오류의 형식과 오류를 칭할 이름(e)을 적는다.

 

2) finally

 

예외가 발생했을 때에도 무조건 실행하고 싶은 코드가 있을 경우 사용하는 것이 finally이다.

예를 들어, 나눗셈에서 0으로 숫자를 나누면 ArithmeticException 오류이다.

 

int num;try {    num = 4 / 0;} cath(ArithmeticException e) {    System.out.println("오류 발생");    num = -1;} finally {    System.out.println("무조건 실행");}

 

System.out.println(num);

 

위 코드는 ArithmeticException 오류가 발생했을 때 오류 발생 문장을 출력하고 num 변수에 -1을 저장한다.또한, 오류와 관계없이 무조건 실행이 출력된다.

 

실행결과는 위와 같다.

'Software > JAVA' 카테고리의 다른 글

[JAVA] Day2. 조건문, 반복문, 배열  (0) 2022.12.27
[JAVA] Day1. 자바 기초  (0) 2022.12.27
[JAVA] 객체지향  (0) 2021.07.22
[JAVA] 배열  (0) 2021.07.20
[JAVA] 스캐너로 입력받기  (0) 2021.07.15

출처) 코뮤니티 모각코 "JAVA를 자바" 과정

 

1. 객체지향 프로그래밍 (OOP) 구성요소

- 클래스, 객체, 메소드

 

1) 클래스

객체의 설계도 (틀) 

클래스를 이용해 비슷한 구성의 객체 찍어냄

 

    - 필드 : 클래스에 포함된 변수

    - 메소드 : 클래스 안에 있는 함수

    - 생성자 : 인스턴스가 처음 만들어질 때 실행될 초기화 메소드

 

* 클래스를 이용해 객체를 만드는 과정을 클래스의 인스턴스화라고 한다. 

   즉, A라는 클래스에서 만들어진 객체 = A클래스의 인스턴스

   객체 == 인스턴스

 

2) 메소드

클래스에 선언된 함수

 

public 리턴 자료형 메소드명 (입력1, 입력2 ...) {

    ...

    return 리턴값;

}

 

* public -> 메소드가 선언된 클래스 외부에서도 호출될 수 있는 메소드

 

3) 필드

클래스 안에서 선언된 변수

인스턴스로 변수에 데이터를 저장하고 저장된 데이터를 불러올 수 있음

 

2. 생성자

 

클래스가 인스턴스화 될 때 (객체가 만들어질 때) 반드시 호출되는 클래스의 구성요소

 

클래스와 동일한 이름으로 선언함

 

class Calculator {
    Calculator() {
        System.out.println("생성자 실행");
    }
}

public class Helloworld {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        System.out.println("calculator 생성 완료");
    }
}

 

이 예시는 Calculator 클래스에서 생성자가 호출될 때 "생성자 실행" 문구를 출력하도록 만들었다.

 

실행해보면 생성자 실행이 먼저 출력되고, calculator 생성 완료가 출력된다.

 

생성자는 보통 필드의 값을 초기화하기 위해 사용된다.

 

Calculator 클래스에 x, y라는 변수를 생성했다면 초기값을 설정해주어야 한다.

이렇게 초기값을 설정해 주는 것을 보통 생성자를 통해 한다.

 

class Calculator {
    int x;
    int y;
    Calculator(int a, int b) {
        this.x = a; // x에 a 대입
        this.y = b;
    }
}

 

이 예시의 경우 x, y 변수를 선언하고 생성자에서 int 자료형 데이터 2개를 받아 각각 x와 y에 저장한다.

메소드에서 입력 변수를 받는 방식과 비슷하다.

 

class Calculator {
    int x;
    int y;
    Calculator (int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public class HelloWorld {
    public static void main(String[] args) {
        Calculator calculator = new Calculator(3, 5);
        System.out.println(calculator.x);
        System.out.println(calculator.y);
    }
}

 

Calculator 클래스에서 Calculator 생성자를 만들고, calculator 객체를 만들면서 생성자를 이용해 x = 3, y = 5로 초기화 한 것이다.

이를 실행하면 

3

5

이렇게 출력된다.

 

3. this 키워드

 

this는 인스턴스 (객체)를 가리키는 의미이다.

 

Calculato(int x, int y) {

    this.x = x;

    this.y = y;

 

위의 예제에서 this.x 는 인스턴스 내 필드를 가리키고, x는 입력받은 변수를 가리킨다.

'Software > JAVA' 카테고리의 다른 글

[JAVA] Day1. 자바 기초  (0) 2022.12.27
[JAVA] 예외처리  (0) 2021.07.22
[JAVA] 배열  (0) 2021.07.20
[JAVA] 스캐너로 입력받기  (0) 2021.07.15
[JAVA] 객체, 생성자, 계산기 예제  (0) 2021.01.11

출처) 코뮤니티 모각코 "JAVA를 자바" 과정

 

1. 배열

 

같은 자료형의 변수들을 묶어서 저장한 것이다.

 

1) 선언

 

자료형, 배열 이름 선언

 

* int [] name;

* int name [];

 

두 가지의 방법 중 선택하여 선언할 수 있다.

 

2) 생성

 

자료형, 길이 정해줌

 

int[ ] value;

value = new int[5];

 

* 선언&생성 동시에 -> int[ ] value = new int[5];

 

3) 초기화

 

선언과 동시에 초기화하면 크기 따로 명시하지 않아도 됨 + new 코드 생략 가능

 

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

int[] name = {1, 2, 3, 4, 5};                 // new int[] 생략

 

String[] weeks = {"월", "화", "수", "목", "금"};

 

2. 인덱스

 

배열에 접근하는 인덱스는 0부터 시작

 

name[0] == 1

weeks[3] == "목"

 

3. for문으로 배열 저장 & 출력

 

int leng = 50;

int[] value = new int[leng];

 

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

    value[i] = i * 5;

}

 

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

    System.out.printf("%d\n", value[i]);

}

 

 

'Software > JAVA' 카테고리의 다른 글

[JAVA] 예외처리  (0) 2021.07.22
[JAVA] 객체지향  (0) 2021.07.22
[JAVA] 스캐너로 입력받기  (0) 2021.07.15
[JAVA] 객체, 생성자, 계산기 예제  (0) 2021.01.11
[JAVA] 3의 배수의 합 구하기  (0) 2021.01.11

[출처] 모각코 'JAVA를 자바'

 

1. 스캐너 (Scanner)

 

자바에서 사용자에게 값을 입력받을 때에는 주로 '스캐너'를 사용한다.

 

스캐너를 이용하기 위해서 클래스 가장 상단에 

import java.util.Scanner;

코드를 추가해야 한다.

 

2. 스캐너 객체

 

스캐너를 이용하기 위해서는 스캐너 객체를 만들어야 한다.

스캐너 클래스의 기능을 쓸 수 있는 모듈을 복사한다는 뜻이다.

 

Scanner sc = new Scanner(System.in);

이 코드는 스캐너 클래스의 기능을 사용할 수 있는 sc 라는 이름의 객체(모듈)을 만든다는 의미이다.

 

한 번 스캐너 객체를 만들면 이 객체의 메소드를 이용해 사용자가 원하는 데이터를 읽을 수 있다.

 

String age = sc.next();
System.out.println("나이를 입력하세요: " + age);

이 코드는 스캐너 sc가 스캔한 문자열을 age라는 변수에 저장하고 이를 출력한 코드이다.

 

스캐너는 한 번 만들면 여러번 스캔할 수 있다.

 

3. 스캐너 닫기

 

스캐너를 만든 후 마지막에 닫지 않으면 경고가 뜬다.

 

sc.close();

따라서 항상 마지막에 이 코드를 적어 스캐너를 닫아야 한다.

 

4. 스캐너의 메소드 next

 

스캐너는 next 외에도 다양한 메소드를 제공한다.

 

next가 들어간 메소드를 검색해보면 next + 자료형으로 구성되어있는걸 알 수 있다.

 

nextInt()는 int 데이터를 입력받고, nextFloat()는 float 데이터를 입력받는다.

next는 공백이 생기기 전까지 입력받은 문자열을 읽고 (한 단어),

nextLine은 줄바꿈 전까지 쓴 문자열을 모두 읽는다.

'Software > JAVA' 카테고리의 다른 글

[JAVA] 객체지향  (0) 2021.07.22
[JAVA] 배열  (0) 2021.07.20
[JAVA] 객체, 생성자, 계산기 예제  (0) 2021.01.11
[JAVA] 3의 배수의 합 구하기  (0) 2021.01.11
[JAVA] 클래스와 객체  (0) 2021.01.10

 

조건 1) 자바 클래스 파일명을 Calc.java로 하고 package명은 calc로 한다.

조건 2) 자바 클래스 파일명을 CalcTest.java로 하고 package명은 calc로 한다.

조건 3) Calc 클래스 파일에 정수형 멤버변수로 a, b를 선언한다.

조건 4) Calc 클래스에 기본생성자 함수를 정의하고 a, b 값은 0으로 설정한다.

조건 5) Calc 클래스에 정수형 인자 a, b를 인자(파라메터)로 생성자 함수를 정의하고 멤버 변수에 인자로 전달된 값을 대입한다.

조건 6) Calc 클래스에 멤버 함수 void add(), void sub(), void mul(), void div(), void mod() 함수를 정의한다.

조건 7) 6에서 정의한 함수를 아래와 같이 결과가 나오게 구현한다.

          a = 10, b = 2

          add() -> 10 + 2 = 12

          sub() -> 10 - 2 = 8

          mul() -> 10 * 2 = 20

          div() -> 10 / 2 = 5

          mod() -> 10 % 2 = 0  

조건 8) CalcTest 클래스 메인 함수에서 Calc 클래스 객체를 생성할 때 값으로 10, 2를 전달하여 객체를 생성하고 생성된 객체를 이용하여 6에서 정의된 함수를 호출하여 조건 7과 같이 나오는지 확인한다.

 

package calc;

public class Calc {
    private int a;
    private int b;
    
    public void add() {
        System.out.println(a + " + " + b + " = " + (a+b));
    }
    
    public void sub() {
        System.out.println(a + " - " + b + " = " + (a-b));
    }
	
    public void mul() {
        System.out.println(a + " * " + b + " = " + (a*b));
    }
	
    public void div() {
        System.out.println(a + " / " + b + " = " + (a/b));
    }
	
    public void mod() {
        System.out.println(a + " % " + b + " = " + (a%b));
    }
    
    public Calc() {            //기본생성자
        a = 0;
        b = 0;
    }
    
    public Calc (int cA, int cB) {
        a = cA;
        b = cB;
    }
}
pakage calc.test;
import calc.Calc;

public class CalcTest {
    
    public static void main(String[] args) {
        Calc calc1 = new Calc(10, 2);
        
        calc1.add();
        calc1.sub();
        calc1.mul();
        calc1.div();
        calc1.mod();
    }
}

 

결과 

 

패키지명에서 calc 오타때문에 아주 고생했다. . .

 

'Software > JAVA' 카테고리의 다른 글

[JAVA] 배열  (0) 2021.07.20
[JAVA] 스캐너로 입력받기  (0) 2021.07.15
[JAVA] 3의 배수의 합 구하기  (0) 2021.01.11
[JAVA] 클래스와 객체  (0) 2021.01.10
[JAVA] 조건문, 반복문  (0) 2021.01.10

조건 1) 자바 클래스 파일명을 Exam2.java 로 한다.
조건 2) main()을 만든다.
조건 3) for 루프를 이용하여 1에서부터 100까지 3의 배수의 전체 합을 구하는 프로그램을 작성한다.

package exam2;

public class Exam2 {
    public static void main(String[] args) {
        int total = 0;
        
        for (int i = 0; i <= 100; i++) {
            if (i % 3 == 0)
                total += i;
            else continue;
            
            System.out.println("sum = " + total + ", i = " + i);
        }
        
        System.out.println("total = " + total);
    }
}


결과

쏘 이지

'Software > JAVA' 카테고리의 다른 글

[JAVA] 스캐너로 입력받기  (0) 2021.07.15
[JAVA] 객체, 생성자, 계산기 예제  (0) 2021.01.11
[JAVA] 클래스와 객체  (0) 2021.01.10
[JAVA] 조건문, 반복문  (0) 2021.01.10
[JAVA] 변수, 상수, 형변환, 연산자  (0) 2021.01.10

+ Recent posts