혼자공부하는자바 인스턴스 멤버와 정적 멤버

 

  • 클래스 멤버를 인스턴스 멤버와 정적 멤버로 구분해서 선언할 수 있음
  • 인스턴스 멤버: 객체마다 가지고 있는 멤버
  • 정적 멤버: 클래스에 위치시키고 객체들이 공유하는 멤버

 

인스턴스 멤버와 this

  • 인스턴스 멤버: 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드
  • 인스턴스 멤버 선언
public class Car {

//필드

int gas;



//메소드

void set Speed(int speed) {....}

}
  • 메모리 블록 내부에 인스턴스 필드 등이 사용되는 경우가 있음
  • 인스턴스 필드가 사용되면 메소드는 객체 없이 실행할 수 없음

 

 

this

  • 객체 내부에서 인스턴스 멤버에 접근하기 위해 this를 사용
  • 객체는 자신을 this라고 함
  • 주로 생성자와 메소드의 매개 변수 이름이 필드와 동일한 경우, 인스턴스 멤버인 필드임을 명시할 때 사용

 

정적 멤버와 static

  • 정적 멤버: 클래스에 고정된 멤버로 객체를 생성하지 않고 사용할 수 있는 필드와 메소드
  • 정적 멤버 선언 -> static 키워드를 추가적으로 붙이면 됨
public class 클래스 {

//정적 필드

static 타입 필드 [=초기값];



//정적 메소드

static 리턴 타입 메소드( 매개변수선언, ...) {...}

}

 

  • 클래스에 고정된 멤버로 클래스 로더가 클래스(바이트 코드)를 코딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리
  • 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언
  • 객체마다 가지고 있을 필요가 없는 공용 데이터라면 정적 필드로 선언

 

정적 멤버 사용

  • 클래스 이름과 함께 도트(.) 연산자로 접근
클래스.필드;

클래스.메소드(매개값, ...);

 

정적 메소드 선언 시 주의할 점

  • 정적 메소드를 선언할 때는 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없음
  • this 키워드도 사용 불가능
  • 정적 메소드에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근

 

싱글톤(Singleton)

  • 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우
  • 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 함 -> private 접근 제한자 붙이기
  • 자신의 타입인 정적 필드를 선언하고 자신의 객체를 생성해 초기화
  • 외부에서 호출할 수 있는 정적 메소드 getInstance() 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 리턴

 

public class 클래스 {

//정적 필드

private static 클래스 singleton = new 클래스();



//생성자

private 클래스() {}



//정적 메소드

static 클래스 getInstance() {

   return singleton;

}

}

 

  • 외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드를 호출하는 방법 -> 단 하나의 객체만 리턴

 

final 필드와 상수

  • final 필드: 초기값이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없음
final 타입 필드 [=초기값];
  • final 필드의 초기값을 주는 방법
    • 필드 선언시 주는 방법
    • 생성자에서 주는 방법

 

상수 constant

  • final 필드는 상수가 아님 
  • 객체마다 저장되고, 생성자의 매개값을 통해서 여러 가지 값을 가질 수 있기 때문에 상수 x
  • 상수는 static이면서 final 이어야함

 

static final 타입 상수= 초기값;
  • 상수 이름은 모두 대문자로 작성
  • 혼합된이름은 (_)로 연결

 

확인문제

  • 정적 멤버는 static으로 선언된 필드와 메소드를 말한다 (o)
  • 인스턴스 필드는 생성자에서 초기화될 수 없다.(x)
  • 정적 필드와 메소드는 객체 생성 없이 클래스를 통해 접근할 수 있다. (o)
  • 인스턴스 필드와 메소드는 객체를 생성하고 사용해야 한다 (o)
  • final 필드와 상수는 초기값이 저장되면 값을 변경할 수 없다 (o)
  • final 필드와 상수는 생성자에서 초기화 될 수 있다. (x)
  • 상수의 이름은 대문자로 작성하는 것이 관례이다 (o)
  • 상수는 객체 생성없이 클래스를 통해 사용할 수 있다 (o)

자바의 정석 기초편

접근 제어자(access modifier)

  • private: 같은 클래스 내에서만 접근이 가능
  • (default): 같은 패키지 내에서만 접근이 가능
  • protected: 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능
  • public: 접근 제한이 전혀 없음
  • public > protected > (default) > private

 

캡슐화와 접근 제어자

 

 

  • 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서

class Time{
    private int hour; //0~23 사이의 값을 가져야 함.
    private int minute;
    private int second;


    public void setHour(int hour){
        if(isValidhour(hour)) return;
        this.hour = hour;
    }

    //매개 변수로 넘겨진 hour가 유효한지 확인해서 알려주는 메서드
    private boolean isValidhour(int hour){
        return hour <0 || hour >23;
    }

    public int getHour() { return hour; };
}


public class TimeTest {
    public static void main(String[] args) {
        Time t = new Time();
//        t.hour = -100;
        t.setHour(21); //hour의 값을 21로 변경
        System.out.println(t.getHour());
        t.setHour(100);
        System.out.println(t.getHour());

    }
}

 

  • 접근제어자의 범위는 최소화 시키는 것이 좋다

다형성(polymorphism)

  • 여러가지 형태를 가질 수 있는 능력
  • 조상 타입 참조 변수로 자손 타입 객체를 다루는 것
  • 타입 불일치해도 괜찮다
  • 객체와 참조변수의 타입이 일치할 때와 일치하지 않을 때의 차이
  • 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없음
  • 참조변수의 타입은 인스턴스의 타입과 일치하는 것이 보통이지만 일치 하지 않을 수도 있음
  • 참조변수가 조상타입일 때와 자손 타입일 때의 차이
    • 참조변수로 사용할 수 있는 멤버의 갯수가 달라짐
  • 자손타입의 참조변수로 조상 타입의 객체를 가리킬 수 없음

 

참조변수의 형변환

  • 사용할 수 있는 멤버의 갯수를 조절하는 것
  • 조상 자손 관계의 참조변수는 서로 형변환 가능
  •  
public class Ex7_7 {
    public static void main(String[] args) {
        Car car = null;
        FireEngine fe = new FireEngine();
//        FireEngine fe2 = null; //car = (Car)fe; 에서 형변환이 생략됨

        FireEngine fe2 = (FireEngine)car; // 조상 -> 자손으로 형변환
        Car car2 = (Car)fe2;              // 자손 -> 조상으로 형변환
//        car2.drive(); //NullPointerException 발생.
//        fe.water();
//        fe2 = (FireEngine) fe; //자손타입 <- 조상타입, 형변환 생략 불가
//        fe2.water();
    }
}

class Car{
    String color;
    int door;

    void drive() {
        System.out.println("drive, Brrrr~~");
    }

    void stop() {
        System.out.println("stop!!");
    }
}

class FireEngine extends Car {
    FireEngine() {
    }

    void water() {
        System.out.println("water!!!");
    }
}



자바의 정석 기초편

패키지(package)

  • 서로 관련된 클래스의 묶음 (Java8 기준 약 4000개 클래스)
  • 클래스는 클래스 파일(*.class), 패키지는 폴더, 하위 패키지는 하위 폴더
  • 클래스의 실제 이름(full name)은 패키지를 포함(java.lang.String)
  • rt.jar는 클래스들을 압축한 파일 (rt = runtime)

 

패키지의 선언

  • 패키지는 소스파일의 첫번째 문장으로 단 한번 선언
  • 같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다
  • 패키지 선언이 없으면 이름없는(unnamed) 패키지에 속하게 된다

 

클래스 패스(classpath)

  • 클래스 파일(*.class)의 위치를 알려주는 경로 (path)
  • 환경변수 classpath로 관리하며, 경로간의 구분자는 ';'를 사용
  • classpath(환경변수)에 패키지의 루트를 등록해줘야 함

 

import문

  • 클래스를 사용할 때 패키지 이름을 생략할 수 있다.
  • 컴파일러에게 클래스가 속한 패키지를 알려준다
  • java.lang(자바의 기본패키지)의 클래스는 Import하지 않고도 사용할 수 있다.
    • String, Object, System, Thread ...

 

import문의 선언

  • import문을 선언하는 방법
    • import 패키지명.클래스명;
    • import 패키지명.*;
  • imprt문은 패키지문과 클래스 선언 사이에 선언

import문의 선언

  • 이름이 같은 클래스가 속한 두 패키지를 import할 때는 클래스 앞에 패키지 명을 붙여줘야 한다

 

static import문

  • static 멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다

static import문

 제어자(modifier)

  • 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
  • 접근 제어자 public, protected, (default), private
  • 그 외: static, final, abstract, native, transient, synchronized, volatiled, strictfp
  • 하나의 대상에 여러 제어자를 같이 사용 가능(접근제어자는 하나만)

 

static -클래스의, 공통적인

 

static

 

final - 마지막의, 변경될 수 없는

  • 부모가 될 수 없는 마지막 클래스 final

final

 

abstract - 추상의, 미완성의

  • 미완성 설계도 -> 제품생산불가
  • 추상클래스를 상속받아서 완전한 클래스로 만들고 객체 생성가능

abstract

 

자바의 정석 상속

상속(Inheritance)

  • 기존의 클래스로 새로운 클래스를 작성하는 것 (코드의 재사용)
  • 두 클래스를 부모와 자식으로 관계를 맺어주는 것

 

class Parent{}
class Child extends Parent{
...
}
  • 자손은 조상의 모든 멤버를 상속받는다.(생성자, 초기화블럭 제외)
  • 자손의 멤버 개수는 조상보다 적을 수 없다(같거나 많다)

상속

  • 자손의 변경은 조상에 영향을 미치지 않는다.

 

 

포함 관계 

 

  • composite(포함): 클래스의 멤버로 참조변수를 선언하는 것
  • 상속관계 '~은 ~이다.(is-a)'
  • 포함관계 '~은 ~을 가지고 있다.(has-a)' ->대부분 포함관계를 씀

 

클래스 간의 관계 설정하기

class MyPoint{
    int x;
    int y;
}

//class Circle extends MyPoint { //상속
//    int r;
//}

class Circle {
    MyPoint p = new MyPoint();
    int r;
}


public class InheritanceTest {
    public static void main(String[] args) {

        Circle c = new Circle();
        c.p.x =1;
        c.p.y =2;
        c.r = 3;
        System.out.println("c.p.x="+c.p.x);
        System.out.println("c.p.y="+c.p.y);
        System.out.println("c.r="+c.r);
    }

}

 

단일 상속(Single Inheritance)

  • Java는 단일 상속만을 허용한다.
  • 조상은 하나만!
  • 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.

Object클래스 - 모든 클래스의 조상

  • 부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다.
  • 모든 클래스는 Object에 정의된 11개의 메서드를 상속받는다 (toString(), equals(), hashCode(),...)

 

public class InheritanceTest {
    public static void main(String[] args) {

        Circle c = new Circle();
        System.out.println(c.toString()); //Circle@340f438e
        Circle c2 = new Circle();
        System.out.println(c2.toString()); //Circle@30c7da1e
    }

}
  • toString()을 안써도 똑같이 출력된다.
  • println()의 기능

 

오버라이딩(overriding)

  • 상속받은 조상의 메서드를 자신에 맞게 변경하는 것
  • 선언부는 변경 불가, 내용만 변경가능

오버라이딩

class Point {
    int x;
    int y;
    String getLocation(){
        return "x: "+ x + ", y:" +y;
    }
}

class MyPoint3 extends Point {
    int z;
    //조상의 getLocation()을 오버라이딩
    String getLocation(){
        return "x: "+ x + ", y:" +y+" ,z:"+z;
    }

}

public class OverrideTest {
    public static void main(String[] args) {
        MyPoint3 p = new MyPoint3();
        p.x = 3;
        p.y =5;
        p.z =7;
        System.out.println(p.getLocation());
    }
}

 

오버라이딩의 조건

  • 선언부가 조상 클래스의 메서드와 일치해야 한다.
  • 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  • 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

 

오버로딩 vs 오버라이딩

근본적으로 관계 없음

overloading : 기존에 없는 새로운 메서드를 정의하는 것 (new)

overriding: 상속받은 메서드의 내용을 변경하는 것 

 

 

참조변수 super

  • 객체 자신을 가리키는 참조변수, 인스턴스 메서드(생성자)내에만 존재
  • 조상의 멤버를 자신의 멤버와 구별할 때 사용

super() - 조상의 생성자

  • 조상의 생성자를 호출할 때 사용
  • 조상의 멤버는 조상의 생성자를 호출해서 초기화

조상의 생성자

  • 클래스 이름 대신 super를 사용
  • 생성자의 첫 줄에 반드시 생성자를 호출해야 한다.
  • 그렇지 않으면 생성자의 첫 줄에 super();를 삽입한다.(조상의 기본 생성자)

 

 

혼공자 자바 java

메소드 선언부 method signiture

  • 리턴 타입: 메소드가 리턴하는 결과의 타입 푷시
  • 메소드 이름: 메소드의 기능이 드러나도록 식별자 규칙에 맞게 이름을 지어준다
  • 매개 변수 선언: 메소드를 실행할 때 데이터를 받기 위한 변수를 선언
  • 메소드 실행 블록: 실행할 코드를 작성

 

메소드 선언

  • 메소드 선언은 선언부와 실행 블록으로 구성

 

리턴 타입

  • 리턴값의 타입 == 실행한 후의 결과값
  • 메소드는 리턴값이 있을 수도 있고 없을 수도 있으나 리턴값이 있을 경우 리턴 타입이 선언부에 명시되어야 함

 

메소드 이름

  • 숫자로 시작하면 안되고 $와_를 제외한 특수문자 사용 금지
  • 관례적으로 메소드 이름은 소문자로 작성
  • 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫 글자는 대문자로 작성

 

매개 변수 선언

  • 메소드가 실행할 때 필요한 데이터를 외부로부터 받기 위해 사용

 

매개 변수의 개수를 모를 경우

  • 매개 변수를 배열 타입으로 선언하는 것
int sum1(int[] values){ }
int sum2(int ...values) { }

 

리턴문

  • 리턴값이 있는 메소드
  • return 리턴값;
  • return문이 없다면 컴파일 에러가 발생
  • return문이 실행되면 메소드는 즉시 종료

 

리턴값이 없는 메소드:void

  • void로 선언된 메소드에서 return은 메소드 실행을 강제 종료 시키는 역할을 함

 

메소드 호출

  • 메소드는 클래스 내.왜부의 호출에 의해 실행됨
  • 클래스 내부의 다른 메소드에서 호출할 경우 단순한 메소드 이름으로 호출하면 되지만
  • 클래스 외부에서 호출할 경우, 클래스로부터 객체를 생성한 뒤 참조변수를 이요해서 메소드를 호출해야함
  • 객체가 존재해야 메소드도 존재하기 때문

 

객체 내부에서 호출

메소드(매개값, ...);
타입 변수 = 메소드(매개값, ...);

 

객체 외부에서 호출

  • 외부 클래스에서 메소드를 호출하려면 클래스로부터 객체를 생성해야함
  • 메소드는 객체에 소속된 멤버이므로 객체가 존재하지 않으면 메소드도 존재하지 않기 때문
클래스 참조변수 = new 클래스 (매개값,..);

 

  • 객체가 생성되었다면 참조 변수와 함께 도트(.) 연산자를 사용해서 메소드를 호출

참조변수.메소드(매개값, ...);
타입 변수 = 참조변수.메소드(매개값, ...);

 

메소드 오버로딩

  • 클래스 내에 같은 이름의 메소드를 여러개 선언하는 것
  • 매개 변수의 타입, 개수, 순서 중 하나가 달라야 함
  • 매개값을 다양하게 받아 처리 할 수 있음
  • 이름만 다르다고 해서 오버로딩이 아님

 

확인 문제

  • 리턴값이 없는 메소드는 리턴 타입을 void로 해야한다.
  • 리턴 타입이 있는 메소드는 리턴값을 지정하기 위해 반드시 return문이 있어야한다
  • 매개값의 개수를 모를 경우 ... 를 이용해서 매개 변수를 선언할 수 있다.
  • 같은 이름의 메소드를 여러 개 선언하는 것을 메소드 오버로딩이라고 한다.

 

메소드 오버로딩에 대한 설명으로 맞는 것에 O/X

  • 동일한 이름의 메소드를 여러개 선언 하는 것을 말한다. (o)
  • 반드시 리턴 타입이 달라야 한다. (x)
  • 매개 변수의 타입, 개수, 순서를 다르게 선언해야 한다.(o)
  • 매개 값을 타입 및 개수에 따라 호출될 메소드가 선택된다 (o)

 

MemberService

public class MemberService {
    boolean login(String id, String password) {
        if (id.equals("hong") && password.equals("12345")) {
            return true;
        } else {
            return false;
        }
    }

    void logout(String id){
        System.out.println("로그아웃 되었습니다.");
    }
}

 

 

혼공자

생성자 constructor

new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당

 

객체 초기화

  • 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것
  • new 연산자에 의해 생성자가 실행되면 힙 영역에 객체가 생성되고 객체의 번지 리턴
  • 리턴된 객체의 번지는 클래스 변수에 저장

 

기본 생성자 default constructor

[public] 클래스() {}
  • 클래스가 public class로 선언되면 기본 생성자에도 public이 붙지만 클래스가 public 없이 선언되면 기본 생성자에도 public 없음

 

생성자 선언

클래스( 매개변수선언, ....){  객체 초기화 코드}

 

  • 리턴 타입이 없고 클래스 이름과 동일
  • 블록 내부에 객체 초기화 코드가 작성됨
  • 필드에 초기값을 저장하거나 메소드를 호출하여 객체 사용전에 필요한 준비를 함
  • 매개 변수는 new 연산자로 생성자를 호출할 때 외부의 값을 생성자 블록 내부로 전달하는 역할을 함

 

 

필드 초기화

  • 클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정됨
  • 초기화하는 방법
  • 필드를 선언할 때 초기값을 주는 방법
  • 생성자에게 초기값을 주는 방법

 

생성자 오버로딩

  • 매개변수를 달리하는 생성자를 여러개 선언하는 것

 

다른 생성자 호출: this()

  • 생성자에서 다른 생성차를 호출할 때 this()코드를 사용
  • 생성자의 첫 줄에서만 허용
  • this()의 매개값은 호출되는 생성자의 매개 변수에 맞게 제공해야 함
  • this() 다음에는 추가적인 실행문들이 올 수 있음
  • 호출되는 생성자의 실행이 끝나면 원래 생성자로 돌아와서 다음 실행문을 진행

 

확인 문제

  • 객체를 생성하려면 생성자 호출이 반드시 필요한 것은 아니다. (x)
  • 생성자는 다른 생성자를 호출하기 위해 this()를 사용할 수 있다. (o)
  • 생성자가 선언되지 않으면 컴파일러가 기본 생성자를 추가한다. (o)
  • 매개 변수의 수, 타입, 순서가 다른 생성자를 여러 개 선언할 수 있다. (o)

 

 

Member 클래스 작성

public class Member {
    
    String name;
    String id;
    
    public Member(String name, String id){
        this.name = name;
        this.id = id;
    }
}

 

Board 클래스 작성

public class Board {
    
    String title;
    String content;
    String writer;
    String date;
    int hitcount;
    
    Board(String title, String content, String writer, String date, int hitcount){
        this.title = title;
        this.content = content;
        this.writer = writer;
        this.date =date;
        this.hitcount = hitcount;
    }
    
    Board(String title, String content){
        this(title, content, "로그인한 회원아이디", "현재 컴퓨터 날짜", 0);
    }
    
    Board(String title, String content, String writer){
        this(title, content,writer,"현재 컴퓨터 날짜", 0);
    }
    
    Board(String title, String content, String writer, String date){
        this(title, content,writer,date,0);
    }
    
}

 

혼자 공부하는 자바

 

필드

객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 데이터를 저장하는 곳

 

필드 선언

  • {} 블록에 존재
  • 위치는 상관 없음
  • 단, 생성자와 메소드 중괄호 {} 내부에는 선언 될 수 없음
  • 생성자와 메소드 중괄호 블록 내부에 선언된 것은 모두 로컬 변수
  • 타입 필드 [=초깃값];
  • 선언형태는 변수와 피슷하지만 필드는 변수가 아님
  • 초기값이 저장되지 않은 필드는 객체 생성 시 자동으로 기본 초기값으로 설정됨
  • 참조 타입은 객체를 참조하고 있지 않은 상태인 null로 초기화

 

필드 사용

  • 필드값을 읽고 변경하는 작업
  • 클래스 내부의 생성자나 메소드에서 사용할 경우 필드 이름으로 일고 변경하면 됨
  • 클래스 외부에서 사용할 경우 우선적으로 클래스로부터 객체를 생성한 뒤 필드를 사용
  • 필드가 객체에 소속된 데이터이므로 객체가 있어야 필드도 존재함
  • 변수가 객체를 참조하게 되면 도트(.) 연산자를 사용해서 필드에 접근
  • 도트(.)연산자는 객체 접근 연산자

 

확인 문제

  • 필드는 메소드에서 사용할 수 있다. (o)
  • 필드는 클래스 블록 어디서든 선언할 수 있다(생성자, 메소드 내부 제외) (o)
  • 필드는 객체 외부에서 접근할 수 없다. (x)
  • 필드는 초기값을 주지 않더라도 기본값으로 자동 초기화 된다. (o)

 

Member Class 선언하기

public class Member {

    String name;
    String id;
    String password;
    int age;

    public static void main(String[] args) {
        Member member = new Member();
        member.name = "최하얀";
        member.age =23;

        System.out.println("이름: "+member.name);
        System.out.println("나이: "+member.age);
    }
}

필드 선언 연습

 

 

자바의 정석

오버로딩(overloading)

  • 한 클래스 안에 같은 이름의 메서드 여러 개 정의하는 것
  • println 이 대표적
  • 오버로딩이 성립하기 위한 조건
    • 1. 메서드 이름이 같아야 한다.
    • 2. 매개변수 개수 또는 타입이 달라야 한다.
    • 3. 반환 타입은 영향 없다.
  • 매개변수는 다르지만 같은 의미의 기능수행

 

생성자(constructor)

  • 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드
  • 인스턴스 생성시 수행할 작업(iv 초기화)에 사용

생성자

  • iv 초기화 메서드
  • 이름이 클래스 이름과 같아야 한다.
  • 리턴값이 없다(void 안붙임)
  • 모든 클래스는 반드시 생성자를 가져야 한다 (한개이상)

 

기본 생성자(default constructor)

  • 매개 변수가 없는 생성자
  • 생성자가 하나도 없을 때만 컴파일러가 기본 생성자 자동 추가

클래스이름() {} // 기본 생성자

 

 

매개변수가 있는 생성자

 

매개변수가 있는 생산자

 

생성자 this()

  • 생성자에서 다른 생성자 호출할 때 사용
  • 다른 생성자 호출시 첫 줄에서만 사용 가능 

코드의 중복을 제거

 

참조 변수 this

  • this() 생성자랑 전혀 다른거임
  • 인스턴스 자신을 가리키는 참조변수
  • 인스턴스 메서드(생성자 포함)에서 사용가능
  • 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용
  • 같은 클래스 안에서는 생략 가능

 

참조변수 this와 생성자 this()

this

인스턴스 자신을 가리키는 참조변수 인스턴스 주소가 저장되어 있다.

모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다. (선언 안해도 사용가능)

 

this(), this(매개변수) 

생성자

같은 클래스의 다른 생성자를 호출할 때 사용한다.

 

 

변수의 초기화

  • 지역변수(lv)는 수동 초기화 해야함(사용전 꼭!!!)
  • 멤버변수(iv, cv)는 자동 초기화 된다

 

 

멤버변수의 초기화

1. 명시적 초기화(=) 간단 초기화

 

Class Car {

         int door =4;             //기본형(primitive type) 변수의 초기화

         Engine e = new Engine()  //참조형(reference type) 변수의 초기화

2. 초기화 블럭 (복잡한 초기화)

- 인스턴스 초기화 블럭: {}

- 클래스 초기화 블럭: static {}

 

3. 생성자

-Iv 초기화, 복잡한 초기화에 사용

 

 

클래스 변수 초기화 시점: 클래스가 처음 로딩될 때 한번

인스턴스 변수 초기화 시점: 인스턴스가 생성될 때 마다

1. cv -> iv

2. 자동 0 -> 간단 = -> 복잡 static {}

 

 

 

 

 

 

객체 지향 프로그래밍 OOP:Object-Oriented Programming

 

객체란?

  • 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별 가능한 것.
  • 객체는 속성과 동작으로 구성
  • 객체 모델링(Object Modeling): 현실 세계의 객체를 소프트웨어 객체로 설계하는 것

 

객체의 상호작용

  • 객체들 사이의 상호작용 수단은 메소드
  • 객체가 다른 객체의 기능을 이용하는 것 == 메소드 호출
  •  

메소드 호출

  • 리턴값 = 전자계산기객체.메소드(매개값1, 매개값2,...);
  • int result = Calculator.add(10,20);

 

객체 간의 관계

  • 객체는 개별적으로 사용될 수 있으나, 대부분 다른 객체와 관계를 맺고 있음
    • 집합관계: 하나는 부품, 하나는 완성품
    • 사용관계: 객체간의 상호작용; 객체는 다른 객체의 메소드를 호출하여 원하는 결과를 얻음
    • 상속관계: 상위객체를 기반으로 하위 객체를 생성하는 관계

 

객체와 클래스

  • 클래스: 설계도; 객체를 생성하기 위한 필드와 메소드와 정의되어 있음
  • 인스턴스: 클래스로부터 만들어진 객체

 

객체 지향 프로그래밍 개발

1. 클래스 설계

2. 설계된 클래스를 가지고 사용할 객체를 생성

3. 생성된 객체를 이용

 

 

클래스 선언

  • public 접근 제한자: 파일이름과 동일한 이름의 클래스 선언에만 붙일 수 있음
  • 파일 이름과 일치하지 않는 클래스 선언에 public 접근 제한자를 붙이면 컴파일 에러가 발생
  • 소스 파일 하나당 동일한 이름의 클래스 하나를 선언하는 것이 좋음

 

객체 생성과 클래스 변수

  • 클래스로부터 객체를 생성하려면 new 연산자를 사용
  • new 클래스();
  • new는 클래스로부터 객체를 생성시키는 연산자
  • new 연산자 뒤에 생성자가 오고 생성자는 클래서()형태를 가지고 있음
  • new 연산자로 생성된 객체는 Heap 영역에 생성됨
  • 힙영역에 객체 생성 후 객체의 번지를 리턴
  • 대부분의 객체 지향 프로그램은 라이브러리와 실행 클래스가 분리되어 있음

 

 

클래스의 구성 멤버

  • 필드: 객체의 고유 데이터, 부품 객체, 상태 정보를 저장;
    • 생성자와 메소드 전체에서 사용되며 객체가 소멸 되지 않는 한 객체와 함께 존재
  • 생성자: 생성자는 new 연산자로 호출되는 특별한 중괄호 {} 블록; 
    • 객체 생성 시 초기화 담당
    • 클래스 이름으로 되어있고 리턴 타입으 잆음
  • 메소드: 객체의 동작에 해당하는 중괄호{} 블록
    • 메소드를 호출하면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행
    • 필드를 읽고 수정하는 역할 + 다른 객체를 생성해서 다양한 기능을 수행
    • 객체 간의 데이터를 전달하는 수단
    • 외부로부터 매개값을 받아 실행 + 실행 후 결과 값을 외부로 리턴

 

 

자바의 정석 기초편

 

return문

실행 중인 메서드를 종료하고 호출한 곳으로 되돌아간다.

 

메서드가 작업을 마쳤을 때 return; //반환 타입이 void이면 생략가능

 

 

반환 타입이 void가 아닌 경우, 반드시 return문 필요

 

 

반환값

-타입이 다 일치해야함

 

 

호출 스택(call stack)

- stack(스택) : 밑이 막힌 상자, 위에 차곡차곡 쌓인다.

- 메서드 수행에 필요한 메모리가 제공되는 공간

- 메서드가 호출되면 호출스택에 메모리 할당, 종료되면 해제

- 아래 있는 메서드가 위의 메서드를 호출

- 맨 위의 메서드 하나만 실행, 나머지는 대기중

 

호출 스택

 

기본형 매개변수

  • 기본형 매개변수 : 변수의 값을 읽기만 할 수 있다. (read only)
  • 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. (read& write)

 

 

static 메서드 인스턴스 메서드

  • 인스턴스 메서드
    • 인스턴스 생성 후, 참보변수, 메서드이름()으로 호출
    • 인스턴스 멤버 (iv, im) 관련된 작업을 하는 메서드
    • 메서드 내에서 인스턴스 변수 사용 가능
  • static 메서드(클래스메서드)
    • 객체 생성 없이 클래스 이름.메서드() 으로 호출
    • 인스턴스 멤버와 관련없는 작업을 하는 메서드
    • 메서드 내에서 인스턴스 변수(iv) 사용 불가

iv를 사용하지 않으면 static 메서드

static 메서드는 인스턴스 메서드를 호출할 수 없다.

 

static 메서드는 인스턴스 변수를 사용할 수 없다.

 

왜 쓸수 없나

-> static 메서드 호출시 객체(iv묶음)가 없을 수도 있어서.

자바는 객체지향언어

객체지향 언어

  • 80년 초 소프트웨어의 위기 - 빠른 변화를 못쫓아감
  • 해결책으로 객체지향 언어를 도입(절차적 -> 객체지향)
  • 1996년 Java가 나옴
  • 코드의 재사용성이 높고 유지보수가 용이, 중복 코드 제거
  • 객체지향 언어 = 프로그래밍 언어 + 객체지향개념(규칙) // 외우세요

OOP(Object-oriented prgramming) 객체지향언어의 4가지 핵심

1. 캡슐화

2. 상속

3. 추상화

4. 다형성

 

 

클래스와 객체

  • 클래스의 정의: 객체를 정의해 놓은 것 ->제품 설계도
  • 클래스의 용도: 객체를 생성하는데 사용
  • 객체의 정의 : 실제로 존재하는 것, 사물 또는 개념 ->제품
  • 객체의 용도: 객체가 가지고 있는 기능과 속성에 따라 다름

 

객체의 구성요소 - 속성과 기능

  • 객체 = 속성(변수) + 기능(메서드)

 

객체와 인스턴스

  • 객체: 모든 인스턴스를 대표하는 일반적 용어
  • 인스턴스: 특정 클래스로부터 생성된 객체

클래스 ---인스턴스화--> 인스턴스(객체)

 

객체와 인스턴스

 

클래스가 필요한 이유? 

-> 객체를 생성하기 위해

 

객체가 필요한 이유?

-> 객체를 사용하기 위해

 

객체를 사용한다는 것은?

-> 객체가 가진 속성과 기능을 사용하려고

 

 

하나의 소스파일에 여러 클래스 작성

  • public class 가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야한다.
  • public class가 하나도 없는 경우, 소스파일의 이름은  상관 없음

하나의 소스파일에 여러 클래스 작성

객체의 생성과 사용

1. 객체의 생성

 

클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언 --> 리모콘 역할

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

Tv t;   //Tv 클래스 타입의 참조변수 t를 선언

t = new tv(); //Tv 인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장

 

2. 객체의 사용

 

t.channel = 7;  // Tv인스턴스의 멤버변수 channel의 값을 7로 한다.

t.channelDown();  // Tv인스턴스 메서드 channelDown()을 호출한다.

System.out.println("현재 채널은 " + t.channel + " 입니다.");

 

객체의 생성과 사용 - 예제

  • 참조변수가 없으면 객체는 사용 불가 -> Garbage Collector 가 제거해간다.
  • 하나의 인스턴스를 여러 개의 참조변수가 가르키는 경우 (가능)
  • 여러 인스턴스를 하나의 참조변수가 가르키는 경우 (불가능)

 

class Ex6_1 {
    public static void main(String args[]) {
        Tv t;                 // Tv인스턴스를 참조하기 위한 변수 t를 선언
        t = new Tv();         // Tv인스턴스를 생성한다.
        t.channel = 7;        // Tv인스턴스의 멤버 변수 channel의 값을 7로 한다.
        t.channelDown();      // Tv인스턴스 메서드 channelDown()을 호출한다.
        System.out.println("현재 채널은 " + t.channel + " 입니다..");
    }
}

class Tv {
    // Tv의 속성(멤버변수)
    String color;           // 생상
    boolean power;             // 전원상태(on/off)
    int channel;               // 채널

    // Tv의 기능(메서드)
    void power()   { power = !power; }  // TV를 켜거나 끄는 기능을 하는 메서드
    void channelUp()   {  ++channel; }  // TV의 채널을 높이는 기능을 하는 메서드
    void channelDown() { --channel; }   // TV의 채널을 낮추는 기능을 하는 메서드
}

 

class Ex6_2 {
    public static void main(String args[]) {
        Tv t1 = new Tv();  // Tv t1; t1 = new Tv();를 한 문장으로 가능
        Tv t2 = new Tv();
        System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
        System.out.println("t2의 channel값은 " + t2.channel + "입니다.");

        t1.channel = 7;    // channel 값을 7으로 한다.
        System.out.println("t1의 channel값은 7로 변경하였습니다.");
        System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
        System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
    }
}

객체마다 별도의 저장공간을 가진다.

 

객체 배열

객체 배열 == 참조변수 배열

 

 

클래스의 정의

클래스 == 데이터 + 함수

 

1. 변수: 하나의 데이터를 저장할 수 있는 공간

2. 배열: 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간

3. 구조체: 서로 관련된 여러 데이터(종류 관계x)를 하나로 저장할 수 있는 공간

4. 클래스: 데이터와 함수의 결합(구조체 +함수)

 

사용자 정의 타입 - 원하는 타입을 직접 만들 수 있다.

 

 

선언 위치에 따른 변수의 종류

 

 

cv는 아무때나 사용가능

iv는 객체생성을 해야 사용 가능

lv는 변수 선언문이 수행되었을 때 사용 

 

 

클래스 변수와 인스턴스 변수

공통 속성은 static 붙인다.

 

클래스 이름을 cv에 붙인다.

 

class Ex6_3 {
    public static void main(String args[]) {
        System.out.println("Card.width = " + Card.width);
        System.out.println("Card.height = " + Card.height);

        Card c1 = new Card();
        c1.kind = "Heart";
        c1.number = 7;

        Card c2 = new Card();
        c2.kind = "Spade";
        c2.number = 4;

        System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
        System.out.println("c2은 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")");
        System.out.println("c1은 width와 height를 각각 50, 80으로 변경합니다.");
        c1.width = 50;
        c1.height = 80;

        System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
        System.out.println("c2은 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")");
    }
}

class Card {
    String kind;
    int number;
    static int width = 100;
    static int height = 250;
}

 

메서드란?

1. 문장들을 묶어놓은 것

   - 작업 단위로 문장들을 묶어서 이름 붙인 것

 

2. 값(입력)을 받아서 처리하고 결과을 반환(출력)

 

매서드의 장점

- 코드의 중복을 줄일 수 있다.

- 코드의 관리가 쉽다.

- 재사용 가능

- 반복적으로 수행되는 여러문장을 메서드로 작성

 

메서드 = 선언부 + 구현부

 

반환타입 메서드이름 (타입변수명, 타입변수명, ...)

{

//메서드 호출시 수행될 코드

}

 

메서드

반환타입이 없을 땐 void라고 적는다.

 

메서드의 구현부

지역변수(lv): 메서드 내에 선언된 변수

 

 

메서드의 호출

메서드이름(값1, 값2, ...); // 메서드를 호출하는 방법

 

print99danAll(); // void print99danAll() 호출

int result = add(3,5); // int add(intx, int y)를 호출하고 결과를 result에 저장

 

class Ex6_4 {
    public static void main(String args[]) {
        MyMath mm = new MyMath();
        long result1 = mm.add(5L, 3L);
        long result2 = mm.subtract(5L, 3L);
        long result3 = mm.multiply(5L, 3L);
        double result4 = mm.divide(5L, 3L);

        System.out.println("add(5L, 3L) = " + result1);
        System.out.println("subtract(5L, 3L) = " + result2);
        System.out.println("multiply(5L, 3L) = " + result3);
        System.out.println("divide(5L, 3L) = " + result4);
    }
}

class MyMath {
    long add(long a, long b) {
        long result = a + b;
        return result;
        // return a + b;  //위의 두 줄을 이와 같이 한 줄로 간단히 할 수 있다.
    }
    long subtract(long a, long b) { return a - b; }
    long multiply(long a, long b) { return a * b; }
    double divide(double a, double b) {
        return a / b;
    }
}

 

 

 

 

메서드의 실행흐름

 

자바의 정석 배열

배열

 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

 

배열의 선언과 생성

배열의 선언 - 배열을 다루기 위한 참조변수 선언

 

1. 타입[] 변수이름

 - Int[] score;

 - score = new int[5];

 

2. 타입 변수이름[]

 

배열의 인덱스

각 요소에 자동으로 붙는 번호

"인덱스(Index)의 범위는 0부터 배열길이-1"까지

public class Ex5_1_tmp {
    public static void main(String[] args) {
//        int[] score; 1. 배열 score를 선언(참조변수)
//        score = new int[5]; 2. 배열의 생성(int저장공간 x 5)
        
        int [] score = new int[5]; // 배열의 선언과 생성을 동시에
        score[3] =100;
        
    }

배열의 길이

"배열은 한번 생성하면 그 길이를 바꿀 수 없다."

 

배열의 초기화

배열의 각 요소에 처음으로 값을 저장하는 것

 

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

 

배열의 출력

char[] ChArr 

 

캐릭터 배여일 때만 출력 가능

 

// 배열의 요소를 순서대로 하나씩 출력

for( int i=0; i<Arr.length; i++){

System.out.println(Arr[i]);}

 

//배열의 모든 요소를 출력

System.out.println(Arrays.toString(Arr));

 

 

배열의 활용

총점과 평균 구하기

public class Ex5_2 {
    public static void main(String[] args) {
        int sum=0;
        float average =-0f;

        int[] score = {100,88,100,100,90};
        for (int i=0; i <score.length; i++){
            sum += score[i];
        }
        average = sum /score.length; //계산결과를 Float으로 얻기

        System.out.println("총점 : " + sum);
        System.out.println("평균 : " + average);
    }
}

 

최대값과 최소값

 

public class Ex5_3 {
    public static void main(String[] args) {
        int[] score = {79, 88, 91, 33, 100, 55,95};

        int max = score[0];
        int min = score[0];

        for(int i=1; i <score.length; i++) {
            if(score[i]> max){
                max = score[i];
            } else if(score[i]<min){
                min = score[i];
            }
        }
        System.out.println("최대값 :"+max);
        System.out.println("최소값 :"+min);
    }
}

 

섞기(Shuffle)

import java.util.Arrays;

public class Ex5_4 {
    public static void main(String[] args) {
        int[] numArr = {0,1,2,3,4,5,6,7,8,9};
        System.out.println(Arrays.toString(numArr));

        for (int i =0; i<100; i++){
            int n = (int)(Math.random()*10);
            int tmp = numArr[0];
            numArr[0] = numArr[n];
            numArr[n] =tmp;
        }
        System.out.println(Arrays.toString(numArr));
    }
}

 

로또 번호 

import java.util.Arrays;

public class Ex5_5 {
    public static void main(String[] args) {
        int[] ball = new int[45]; //45개 정수값을 저장하기

        //배열의 각 요소에 1~45값을 저장
        for(int i=0; i<ball.length; i++){
            ball[i]=i+1; // ball[0]에 1이 저장된다.인덱스는 0부터 시작하니까
        }
        System.out.println(Arrays.toString(ball));
        int tmp =0; // 두 값을 바꾸는데 사용할 임시변수
        int j =0; // 임의의 값을 얻어서 저장할 변수

        // 배열의 i번째 요소와 임의의 요소에 저장된 값을 서로 바꿔서 값을 저장
        // 0번째부터 5번째 요소까지 모두 6개만 바꾼다.
        for (int i=0; i<6; i++){
            j=(int)(Math.random()*45); //0~44범위 임의의 수
            tmp =ball[i];
            ball[i] = ball[j];
            ball[j] = tmp;
            System.out.println(Arrays.toString(ball));
        }
        //배열 ball의 앞에서부터 6개의 요소를 출력한다.
        for(int i=0; i<6; i++){
            System.out.printf("ball[%d]=%d%n", i, ball[i]);
        }

    }
}

결과

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
[12, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
[12, 7, 3, 4, 5, 6, 2, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
[12, 7, 28, 4, 5, 6, 2, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 3, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
[12, 7, 28, 24, 5, 6, 2, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 4, 25, 26, 27, 3, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
[12, 7, 28, 24, 27, 6, 2, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 4, 25, 26, 5, 3, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
[12, 7, 28, 24, 6, 27, 2, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 4, 25, 26, 5, 3, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
ball[0]=12
ball[1]=7
ball[2]=28
ball[3]=24
ball[4]=6
ball[5]=27

Process finished with exit code 0

 

 

String 배열의 선언과 생성

String 클래스

1. String클래스는 char[] 와 메서드(기능)를 결합한 것

   String클래스 = char[] + 메서드(기능)

 

2. String 클래스는 내용을 변경할 수 없다. (read only)

 

String클래스의 주요 메서드

char charAt(int index) : 문자열에서 해당위치(index)에 있는 문자를 반환한다.

int length() : 문자열의 길이를 반환한다

String substring (in from, int to) : 문자열에서 해당 범위(from~to)의 문자열을 반환한다 (to 는 포함 안됨)

boolean equals(Object obj): 문자열의 내용이 같은지 확인한다.

char[] toCharArray(): 문자열을 문자배열로 변환해서 반환

 

 

커맨드 라인을 통해 입력받기

public class Ex5_7 {
    public static void main(String[] args) {
        System.out.println("매개변수의 개수:"+args.length);
        for(int i=0; i< args.length;i++){
            System.out.println("args["+i+"] = \""+ args[i] +"\"");
        }
    }
}

run configuration

run configuration의 arguments를 수정해주면,,,,

 

 

2차원 배열

테이블 형태의 데이터를 저장하기 위한 배열

 

int[][] score = new int[4][3]; //4행 3열의 2차원 배열 score

2차원 배열의 인덱스

2차원 배열의 초기화

int[][] arr = {

                        {1,2,3}

                        {4,5,6}

                     };

 

 

2차원 배열 예제

class Ex5_8 {
   public static void main(String[] args) {
      int[][] score = {
              { 100, 100, 100 }
            , { 20, 20, 20 }
            , { 30, 30, 30 }
            , { 40, 40, 40 }
      };
      int sum = 0;

      for (int i = 0; i < score.length; i++) {
         for (int j = 0; j < score[i].length; j++) {
            System.out.printf("score[%d][%d]=%d%n", i, j, score[i][j]);

            sum += score[i][j];
         }
      }

      System.out.println("sum=" + sum);
   }
}
class Ex5_9 {
    public static void main(String[] args) {
        int[][] score = {
                { 100, 100, 100}
                , { 20, 20, 20}
                , { 30, 30, 30}
                , { 40, 40, 40}
                , { 50, 50, 50}
        };
        // 과목별 총점
        int korTotal = 0, engTotal = 0, mathTotal = 0;

        System.out.println("번호 국어 영어 수학 총점 평균");
        System.out.println("=============================");

        for(int i=0;i < score.length;i++) {
            int  sum = 0;      // 개인별 총점
            float avg = 0.0f;  // 개인별 평균

            korTotal  += score[i][0];
            engTotal  += score[i][1];
            mathTotal += score[i][2];
            System.out.printf("%3d", i+1);

            for(int j=0;j < score[i].length;j++) {
                sum += score[i][j];
                System.out.printf("%5d", score[i][j]);
            }

            avg = sum/(float)score[i].length;  // 평균
            System.out.printf("%5d %5.1f%n", sum, avg);
        }

        System.out.println("=============================");
        System.out.printf("총점:%3d %4d %4d%n", korTotal, engTotal, mathTotal);
    }
}
import java.util.Scanner;

class Ex5_10{
    public static void main(String[] args) {
        String[][] words = {
                {"chair","의자"},        // words[0][0], words[0][1]
                {"computer","컴퓨터"},    // words[1][0], words[1][1]
                {"integer","정수"}       // words[2][0], words[2][1]
        };

        Scanner scanner = new Scanner(System.in);

        for(int i=0;i<words.length;i++) {
            System.out.printf("Q%d. %s의 뜻은?", i+1, words[i][0]);

            String tmp = scanner.nextLine();

            if(tmp.equals(words[i][1])) {
                System.out.printf("정답입니다.%n%n");//%n은 개행
            } else {
                System.out.printf("틀렸습니다. 정답은 %s입니다.%n%n",words[i][1]);
            }
        } // for
    } // main의 끝
}

 

Arrays로 배열 다루기

문자열의 비교와 출력 - equals(), toString()

 

Arrays.toString(arr); 1차원 배열

Arrays.deepToString(arr2D); 2차원 배열

 

Arrays.equlas(arr1, arr2); 1차원배열 비교

Arrays.deepEquals(arr1, arr2); 2차원 이상 배열 비교

 

배열의 복사 - copyOf(), copyOfRange()

 

배열의 정렬 - sort()

 

Arrays.sort(arr); // 오름차순으로정렬

 

 

 

 

 

조건문과 반복문

 

조건문과 반복문 flow control statement(제어문)

조건식

If-else if 문

여러 개 중의 하나 - 여러 개의 조건식을 포함한 조건식

 

중첩 if 문

중첩횟수 제약은 없음

괄호가 중요,,!

 

Switch문

처리해야 하는 경우의 수가 많을 때 유용한 조건문

break문을 빼먹지 말자

 

1. 조건식을 계산한다.

2. 조건식의 결과와 일치하는 case문으로 이동한다.

3. 이후의 문장들을 수행한다.

4. break문이나 switch문의 끝을 만나면 switch문 전체를 빠져나간다.

 

Switch문의 제약조건

1. switch문의 조건식 결과는 정수 또는 문자열(1.7 버전이후)이어야 한다.

2. case문의 값은 정수, 상수(문자포함), 문자열만 가능하며, 중복되지 않아야 한다.

 

임의의 정수 만들기

Math.random() - 0.0과 1.0사이의 임의의 double값을 반환

 

0.0 <= Math.random() < 1.0

 

1과 3사이의 정수 구하기

1. 각 변에 3을 곱한다.

 

2. 각 변을 Int형으로 변환한다.

 

3. 각 변에 1을 더한다.

 

System.out.println((int)(Math.random()*11)-5);//-5와 5의 사이

 

for문

조건을 만족하는 동안 블럭{}을 반복 - 반복 횟수를 알 때 적합

변수의 범위(scope)는 좁을수록 좋다; 선언위치부터 선언된 블럭의 끝까지

 

//조건식을 생력하면, true로 간주되엇 무한반복문이 된다.
for(;;){
    System.out.println("i="+1);
}

중첩 for 문

직사각형 별찍기

public class Ex4_15 {
    public static void main(String[] args) {
        for(int i=1; i<=5; i++) {
            for (int j = 1; j <= 10; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

 

별 늘리기

public class Ex4_15 {
    public static void main(String[] args) {
        for(int i=1; i<=5; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

 

 

while문

조건을 만족시키는 동안 블럭{}을 반복 - 반복 횟수 모를 때

 

while 조건식 {

  //조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다.

}

 

for문과 100% 상호 대체 가능

 

for 문

public class Ex4_14 {
    public static void main(String[] args) {
        int num =12345, sum =0;
        //10으로 나머지 연산을 하면 마지막 자리를 얻는다.
//        System.out.println(12345%10);
        //num = 12345, 1234, 123,12, 1
        for(num=12345; num>0; num=num/10){
            System.out.println(num);
        }
        System.out.println("각 자리수의 합:" +sum);
    }
}

while문으로 바꾸기

 

public class Ex4_14 {
    public static void main(String[] args) {
        int num =12345, sum =0;
        //10으로 나머지 연산을 하면 마지막 자리를 얻는다.
//        System.out.println(12345%10);
        //num = 12345, 1234, 123,12, 1
        while(num>0){
            sum += num%10;
            System.out.println("sum"+sum+",num%10="+num%10);
            num =num/10;
        }
        System.out.println("각 자리수의 합:" +sum);
    }
}

 

do-while문

블럭{}을 최소한 한 번 이상 반복 - 사용자 입력받을 때 유용

 

break문

자신이 포함된 하나의 반복문을 벗어난다.

 

while문

public class Ex_16 {
    public static void main(String[] args) {
        int sum =0;
        int i =0;

        while(true){//무한 반복문 for(;true;) {}
            if(sum>100)
                break; //자신이 속한 하나의 반복문을 벗어난다.
            ++i;
            sum += i;
        } // end of while

        System.out.println("i=" +i);
        System.out.println("sum=" + sum);
    }
}

for문

public class Ex_16 {
    public static void main(String[] args) {
        int sum =0;
        int i =0;

        for(;;){//무한 반복문 for(;true;) {}
            if(sum>100)
                break; //자신이 속한 하나의 반복문을 벗어난다.
            ++i;
            sum += i;
        } // end of while

        System.out.println("i=" +i);
        System.out.println("sum=" + sum);
    }
}

 

continue문

자신이 포함된 반복문의 끝으로 이동 - 다음 반복으로 넘아감

전체 반복 중에서 특정 조건시 반복을 건너뛸 때 유용

break문과 달리 반복문을 벗어나지 않는다.

 

public class Ex4_17 {
    public static void main(String[] args) {
      for(int i=0; i<= 10; i++){
          if(i%2==0)
              continue;
          System.out.println(i);
      }
    }
}

 

예시

import java.util.Scanner;

public class Ex4_18 {
    public static void main(String[] args) {
        int menu =0;
        int num =0;

        Scanner scanner = new Scanner(System.in);

        while (true){ // 무한 반복문
            System.out.println("(1) square");
            System.out.println("(2) square root");
            System.out.println("(3) log");
            System.out.println("원하는 메뉴(1~3)을 선택하세요. (종료:0>");

            String tmp = scanner.nextLine(); //화면에서 입력받은 내용을 tmp에 저장
            menu = Integer.parseInt(tmp); //입력받은 문자열(tmp)을 숫자로 변환

            if(menu==0) {
                System.out.println("프로그램을 종료합니다");
                break;
            } else if (!(1<=menu && menu<=3)) {
                System.out.println("메뉴를 잘못 선택하셨습니다. (종료는 0)");
                continue;
            }
            System.out.println("선택하신 메뉴는" + menu + "번입니다.");

        } //main의 끝
    }
}

 

이름붙은 반복문

반복문에 이름을 붙여서 하나 이상의 반복문을 벗어날 수 있다.

 

 

연산자와 피연산자

연산자: 연산을 수행하는 기호

피연산자: 연산자의 연산 수행 대상

"모든 연산자는 연산결과를 반환한다.

 

연산자의 우선순위

"하나의 식(expression)에 연산자가 둘 이상 있을때, 어떤 연산을 먼저 수행할지를 자동 결정하는 것

 

1. 산술 > 비교>논리>대입

2. 단항(1) > 이항 (2) > 삼항(3), 단항연산자의 우선순위가 이항 연산자보다 높다.

3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.

 

형변환 연산자

형변환: 변수 또는 상수의 타입을 다른 타입으로 변환하는것

(타입)피연산자

double d = 85.4

int score = (int)d;

int score = (int)85.4;

int score = 85;

 

- d 자체가 변한게 아님 읽는 방법이 바뀐것임.

 

산술 변환

"연산 전에 피연산자의 타입을 일치 시키는 것"

1. 두 연산자의 타입을 갖게 일치시킨다. (보다 큰 타입으로 일치)

2. 피연산자의 타입이 int보다 작은 타입이면 Int로 변환된다.

 

반올림

Math.round()

 

실수를 소수점 첫째자리에서 반올림한 정수를 반환

 

long result // Math.round(4.52) // 5가 저장됨

 

 

3.142 만드는 법

 

문자 ch

조건 연산자 ? :

조건식의 결과에 따라 연산을 달리한다.

 

result = (x>y) ? x :y ; // 괄호생략가능

조건이 참이면 x, 거짓이면, y

 

if문을 삼항연산자로 간단하게 쓴다.

 

대입 연산자

오른쪽 피연산자를 왼쪽 피연산자에 저장 후 저장된 값을 반

대입연산자

왼쪽 피연산자가 저장공간이여야한다. 아니면 에러가 발생함

 

 

변수 자바의정석

변수(variable)란?

  • 하나의 값을 저장할 수 있는 메모리 공간 RAM

 

변수의 선언

  • 변수의 선언 이유: 값(data)을 저장할 공간을 마련하기 위해서
  • 변수타입 변수이름;

 

변수에 값 저장하기

  • '='는 등호가 아니라 대입
  • 오른쪽의 값을 왼쪽에 저장
  • 지역변수는 읽기 전에 꼭! 초기화

 

변수의 타입

  • 저장할 값의 타입에 의해 결정
  • 저장할 값을 타입과 일치하는 타입으로 변수를 선언

 

변수, 상수, 리터럴

  • 상수(constant) - 한 번만 값을 저장 가능한 변수 (final 붙이면 상수)
  • 리터럴(literal) =기존의 상수; 그 자체로 값을 의미하는 것
  • \n == 개행문자
  • 범위가 '변수(그릇)' > '리터럴(물건)'인 경우, OK; 반대는 에러

 

문자와 문자열

  • String s =""; // 빈 문자열(empty String)
  • char ch=''; // 에러

 

두 변수의 값 교환하기

public class Ex2_1 {
    public static void main(String[] args) {
        int x=4, y=2;
        int tmp;
        tmp =x;
        x=y;
        y=tmp;
        System.out.println(x);
        System.out.println(y);
    }
}

x와 y 값이 교환됨

 

 

기본형과 참조형

  • 기본형(Primitive type): boolean, char, byte, short, int, long, float, double
    • 실제 값을 저장
    • 논리형
    • 문자형
    • 정수형
    • 실수형
  • 참조형(Reference type): 기본형을 제외한 나머지(String, System 등)
    • 메모리 주소를 저장(4 byte 또는 8 byte)
  • default 타입 double, int

 

 

형식화된 출력 - printf()

  • pirntln()의 단점 - 출력형식 지정불가
    • 실수의 자리수 조절불가
    • 10진수로만 출력가능
  • printf()로 출력형식 지정가능
    • System.out.printf("%.2f", 10.0/3); //3.33
      • 소숫점 둘째자리까지만 출력
    • System.out.printf('%d', 0x1A);// 26 -> %d 10진수
    • System.out.printf("%x", 0x1A);// 1A -> 16진수
  • printf()의 지시자

\n는 줄바꿈
printf()

 

Scanner

  • 화면으로부터 데이터를 입력받는 기능을 제공하는 클래스
  • 사용법 

1. import문 추가

    import java.util.*;

2. Scanner 객체의 생성

Scanner scanner = new Scanner System.in; 

3. Scanner 객체의 사용

int num = scanner.nextInt(); // 화면에서 입력받은 정수를 num에 저장

 

 

 

타입간의 변환방법

1. 문자와 숫자간의 변환

- 숫자에 문자'0'을 더하면 문자가 되고 문자에 '0'을 빼면 숫자가된다.

 

2. 문자열로의 변환

- 숫자에 빈문자열""을 더해주면 된다

 

3. 문자열을 숫자로 변환

- Integer.parseInt() 메소드를 사용

-Double.parseDouble()

 

4. 문자열을 문자로 변환하는 방법

- .charAt()

 

 

 

 

자바의정석

 

  • 자바란? 
    • 프로그래밍언어
    • 애플리케이션을 만드는데 사용
      • PC 애플리케이션: IntelliJ, eclipse
      • 웹 애플리케이션
      • 모바일 애플리케이션(안드로이드)
      • 빅 데이터 : hadoop
      • 게임(마인 크래프트), 과학, 소형기기 등
  • Why 자바?
    • 다양한 분야에서 활발히 사용
    • 20년동안 1, 2위를 유지
    • 첫번째 프로그래밍 언어로 GOOD
      • 배우기 쉽고 풍부한 학습자료
    • 모던 프로그래밍 언어(객체지향 + 함수형)
    • 취업에 유리
  • 강의는 Java SE 8 에 맞춰져 있음; 근데 요즘엔 6개월 마다 버전을 출시한다고 함

 

자바의 특징

  • 배우기 쉬운 객체지향 언어(C++, java, python, js)
  • 자동 메모리 관리 (GC: garbage collector)
  • 멀티 쓰레드 지원
  • 운영체제에 독립적

 

자바 가상 머신(JVM)

  • 자바 프로그램이 실행되는 가상컴퓨터(VM)
  • 한번 작성하면, 어디서든 실행(Write once, run anywhere)

자바 API 문서

  • 자바 사전

 

자바의 정석 기초편 github

 

 

GitHub - castello/javajungsuk_basic: 자바의 정석 기초편 관련 자료입니다.

자바의 정석 기초편 관련 자료입니다. Contribute to castello/javajungsuk_basic development by creating an account on GitHub.

github.com

 

+ Recent posts