Arrays

  • 배열을 다루기 편리한 메서드(static) 제공
  • 배열의 출력 toString()
  • 배열의 복사 copyOf(), copyOfRange()
  • 배열 채우기 -fill(), setAll()
  • 배열의 정력과 검색 - sort(), binarySearch()
    • binarySearch하기 전에는 반드시 배열 정렬 .sort() 먼저
  • 다차원 배열의 출력 deepToString()
  • 다차원 배열의 비교 - deepEquals()
  • 배열을 List로 변환 asList(Object ... a)
  • 람다와 스프림 관련 - parallel(), spliterator(), stream()

arrays

 

Comparator 와 Comparable

  • 객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스
  • Comparable - 기본 정렬기준을 구현
  • Comparator - 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용
public interface Comparator {
	int compare(Object o1, Object o2); //o1, o2 두 객체 비교
    boolean equals(Object obj); //equals를 오버라이딩하라는 뜻
  }
  
public interface Comparable {
	int compareTo (Object o); // 주어진 객체 o 를 자신과 비교
 }

 

public final class Integer extends Number implements Comparable {
	...
    public in t compareTo(Integer anotherInteger) {
    	int v1 = this.value;
        int v2 = anotherInteger.value;
        //같으면 0, 오른쪽값이 크면 -1, 작으면 1을 반환
        return (v1 < v2 ? -1: (v1==v2? 0 :1));
    }
    ...
}

 

예제 Ex11_7

import java.util.*;

class Ex11_7 {
    public static void main(String[] args) {
        String[] strArr = {"cat", "Dog", "lion", "tiger"};

        Arrays.sort(strArr); // String의 Comparable 구현에 의한 정렬
        System.out.println("strArr=" + Arrays.toString(strArr));

        Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); // 대소문자 상관 없이 정렬
        System.out.println("strArr=" + Arrays.toString(strArr));

        Arrays.sort(strArr, new Descending()); //역순으로 정렬
        System.out.println("strArr=" + Arrays.toString(strArr));
    }
}

class Descending implements Comparator {
    public int compare(Object o1, Object o2){
        if( o1 instanceof Comparable && o2 instanceof Comparable) {
            Comparable c1 = (Comparable)o1;
            Comparable c2 = (Comparable)o2;
            return c1.compareTo(c2) * -1 ; //-1을 곱해서 기본 정렬방식의 역으로 변경
            // 또는 c2.compareTo(c1)와 같이 순서를 바꿔도 됨
        }
        return -1;
    }
}

 

Integer와 Comparable

  • 삼항연산자가 기본사칙연산보다 상대적으로 빠르다 (2~3% 정도)

 

버블정렬 bubble sort 코드

  • 서로 인접한 두 원소의 대소를 비교하고, 조건에 맞지 않다면 자리를 교환하며 정렬하는 알고리즘
static void sort(int[] intArr) {
	for(int i=0; i<intArr.length-1;i++) {
    	for(int j=0; j<intArr.length-1-i; j++) {
        int tmp =0;
        
        if(intArr[j] > intArr[j+1]) {
        	tmp = intArr[j];
            intArr[j] = intArr[j+1];
            intArr[j+1] =tmp;
            }
     }
}
  • 버블 정렬은 첫 번째 자료와 두 번째 자료를, 두 번째 자료와 세 번째 자료를, 세 번째와 네 번째를, … 이런 식으로 (마지막-1)번째 자료와 마지막 자료를 비교하여 교환하면서 자료를 정렬함
  • 1회전을 수행하고 나면 가장 큰 자료가 맨 뒤로 이동하므로 2회전에서는 맨 끝에 있는 자료는 정렬에서 제외되고, 2회전을 수행하고 나면 끝에서 두 번째 자료까지는 정렬에서 제외된다. 이렇게 정렬을 1회전 수행할 때마다 정렬에서 제외되는 데이터가 하나씩 늘어난다.

https://gyoogle.dev/blog/algorithm/Bubble%20Sort.html

 

거품 정렬(Bubble Sort) | 👨🏻‍💻 Tech Interview

거품 정렬(Bubble Sort) Goal Bubble Sort에 대해 설명할 수 있다. Bubble Sort 과정에 대해 설명할 수 있다. Bubble Sort을 구현할 수 있다. Bubble Sort의 시간복잡도와 공간복잡도를 계산할 수 있다. Abstract Bubble S

gyoogle.dev

 

 

 

 

 

 

 

 

 

 

Iterator

Iterator, ListIterator, Enumeration

  • 컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스
  • iterator만 쓰면됨 (Enumeration은 Iterator의 옛날 버전)
  • ListIterator는 Iterator의 접근성을 향상 시킨것

  • 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것
  • 컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용
List list = new ArrayLsit(); //다른 컬렉션으로 변경할 때는 이 부분만 고치면 된다.
Iterator it = list.interator();

while(it.hasNext()) { //boolean has Next()
	System.out.println(it.next()); 
  }
  • iterator는 1회용이라 다쓰고나면 다시 얻어와야 한다

 

Map과 Iterator

  • Map에는 iterator()가 없음
  • Keyset(), entrySet(), values()를 호출해야함
Map map = new HashMap();
.
.
.
Iterator it = map.entrySet().iterator();

 

 

 

  • stack: LIFO 구조, 마지막에 저장된 것을 제일 먼저 꺼냄
  • Queue: FIFO 구조, 제일 먼저 저장한 것을 제일 먼저 꺼냄

stack and queue

 

Stack 메서드

stack 메서드

 

Queue 메서드

 

  • Queue는 인터페이스
  • stack은 클래스

 

인터페이스를 구현한 클래스 찾기

  • Queue를 구현한 클래스를 사용

Java API문서

  • 스택 활용 예 - 수식계산, undo/redo, 웹브라우저 뒤로/앞으로
  • 큐 활용 예 - 최근사용문서(recent files), 인쇄작업 대기목록, buffer
  • 배열의 장점: 구조가 간단하고 데이터를 읽는데 걸리는 시간(access time)이 짧다
  • 배열의 단점:
    • 크기를 변경할 수 없다 -> 새로운 배열을 생성 후 데이터를 복사해야함
    • 크기 변경을 피하기 위해 충분히 큰 배열을 생성하면 메모리 낭비
    • 비순차적인 데이터의 추가, 삭제에 시간이 많이 걸림
    • 데이터를 추가하거나 삭제하기 위해, 다른 데이터를 옮겨야 함
    • 순차적인 데이터 추가(끝에 추가)와 삭제(끝부터 삭제)는 빠름

LinkedList

LinkedList는 배열의 단점(1. 크기변경 x 2. 추가삭제시간 많이걸림) 을 보완

  • LinkedList는 불연속적으로 존재하는 데이터를 연결(link)
  • 불연속적
class Node{
	Node next; 
        Object obj;
        }
  • 단 한번의 참조변경으로 데이터 삭제 가능
  • 한번의 Node 객체생성과 두번의 참조 변경만으로 데이터 추가 가능

 

LinkedList - 이중 연결 리스트

  • LinkedList - 데이터 접근성이 나쁨
  • doubly linked list - 이중 연결 리스트, 접근성 향상
class Node{
	Node next; 
    Node previous;
        Object obj;
        }

 

  • doubly circular linked list - 이중 원형 연결리스트
  • 자바에서는 이중연결리스트로 구현되어 있음

 

ArrayList vs. LinkedList 

  • ArrayList가 추가할 때 더 빠름
  • 순차적으로 삭제할 때 ArrayList가 빠름
  • 비순차적으로 데이터 추가/삭제 - LinkedList가 빠름 (20배는 차이남)
  • 접근시간(access time)- ArrayList가 빠름 (400배 이상)
  • 읽기는 ArrayList가 빠르고 추가/삭제는 LinkedList가 빠름
  • LinkedList는 데이터가 많을수록 접근성이 떨어짐

 

 

 

 

 

 

 

ArrayList

  • ArrayList는 기존의 Vector를 개선한 것으로 구현원리와 기능적으로 동일
  • List인터페이스를 구현하므로, 저장순서가 유지되고 중복 허용
  • 데이터의 저장공간으로 배열을 사용
  • List 인터페이스 구현
  • 모든 종류의 객체 저장 가능

 

ArrayList 메서드

  • ArrayList()
  • ArrayList(Collection c)
  • ArrayList(int initialCapacity)
  • boolean add(Object o)
  • void add(int index Object element)
  • boolean addAll(Collection c)
  • boolean addAll(int index, Collection c)
  • boolean remove(Object o)
  • Object remove(int index)
  • boolean removeAll(Collection c)
  • void clear()
  • int indexOf(Object o)
  • int lastIndexOf(Object o)
  • boolean contains(Object o)
  • Object get(int index)
  • Object set(int index, Object element)
  • List subList(int fromindex, int toindex)
  • Object[] toArray() 
  • Object[] toArray(Object[] a)
  • boolean isEmpty ()
  • void trim ToSize()
  • int size() (저장된 객체 갯수 반환)

 

list1:[0,1,2,3,4,5]
list2:[0,2,4]

list1.containsAll(list2):true

containsAll: 포함하고 있는지 true/false 반환 하는 메서드

 

list1.remove(1) // 인덱스가 1인 객체를 삭제
list1.remove(new Integer(1)); // 1을 삭제

 

 

 

 

ArrayList 저장된 객체의 삭제 과정

- 마지막 객체부터 삭제하면 됨

 

 

 

 

 

  • collection: 여러 객체(데이터)를 모아 놓은 것
  • framework: 표준화, 정형화된 체계적인 프로그래밍 방식
  • collections framework:
    • 컬렉션을 다루기 위한 표준화된 프로그래밍 방식
    • 컬렉션을 쉽고 편리하게 다룰 수 있는 클래스를 제공
    • java.util 패키지에 포함. JDK1.2부터 제공
  • collection class: 다수의 데이터를 저장할 수 있음

 

컬렉션 프레임웍의 핵심 인터페이스

  • List:
    • 순서가 있는 데이터의 집합
    • 데이터의 중복을 허용
  • Set(집합):
    • 순서를 유지하지 않는 데이터의 집합
    • 데이터의 중복을 허용하지 않음
  • Map:
    • Key와 Value의 쌍(pair)로 이루어진 데이터의 집합
    • 순서는 유지되지 않으며, 키는 중복을 허용하지 않고 값은 중복 허용
    • ex) 우편번호, 지역번호

 

List 인터페이스 - 순서 o, 중복 x

 

List 인터페이스 메서드

 

Set 인터페이스 - 순서 x, 중복 x

 

 

 

Map 인터페이스 - 순서 , 중복 (키 x, 값 o)

 

디폴트 메서드와 static 메서드

디폴트 메서드와 static 메서드

  • 인터페이스에 디폴트 메서드, static 메서드 추가 가능 (JDK1.8부터)
  • 인터페이스에 새로운 메서드(추상 메서드)를 추가하기 어려움
    • 해결책 => 디폴트 메서드(default method) (인터페이스 원칙 위반: 예외)

 

디폴트 메서드가 기존의 메서드와 충돌할 때 해결책

  • 여러 인터페이스와 디폴트 메서드 간의 충돌
    • 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 해야함
  • 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
    • 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시됨

인터페이스 interface

  • 추상 메서드의 집합
  • 구현된 것이 전혀 없는 설계도. 껍데기 (모든 멤버가 public)
  • 기본 설계도
  • 다른 클래스를 작성하는데 도움이 될 목적으로 작성
  • 추상클래스와 인터페이스의 차이
    • 추상클래스는 일부가 구현된 미완성 설계도
    • 인터페이스는 아무것도 구현된 것도 없고 밑그림만 그려져있는 기본 설계도
interface 인터페이스이름 {
	public static final 타입 상수이름 = 값; //상수
    public abstract 메서드이름(매개변수목록); //추상메서드
}

//인터페이스의 모든 메소드는 public이고 final이고 abstract 여서 생략 가능

 

인터페이스의 상속

  • 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상이 아님)
  • 다중 상속이 가능 (추상메서드는 충돌해도 문제 없음)
interface Fightable extends Movable, Attackable {}
interface Movable {
	/** 지정된 위치(x,y)로 이동하는 기능의 메서드 */
    void move(int x, int y);
 }
 
 interface Attackable {
 	/** 지정된 대상(u)을 공격하는 기능의 메서드 */
    void attack(Unit u);
}

 

인터페이스의 구현

  • 인터페이스에 정의된 추상 메서드를 완성하는 것
class 클래스이름 implements 인터페이스이름 {
        // 인터페이스에 정의된 추상메서드를 모두 구현해야 한다
}
  • 구현한다는 의미의 키워드 'implements'를 사용함
class Fighter implements Fightable {
	public void move(int x, int y) { /*내용 생략 */}
    public void attack(Unit u)     { /*내용 생략 */} // 몸통 완성
}

//Fighter 클래스는 Fightable 인터페이스를 구현했다.
  • 추상클래스 완성과 동일; 키워드만 다름
  • 일부만 구현하는 경우, 클래스 앞에 abstract를 붙어야 함

 

  • 인터페이스란?
    • 추상 메서드의 집합
  • 인터페이스의 구현이란?
    • 인터페이스의 추상메서드 몸통{} 만들기(미완성 설계도 완성하기)
  • 추상 클래스와 인터페이스의 공통점은?
    • 추상 메서드를 가지고 있다 (미완성 설계도)
  • 추상 클래스와 인터페이스의 차이점은?
    • 인터페이스는 iv를 가질 수 없다

 

 

인터페이스를 이용한 다형성

  • 인터페이스도 구현클래스의 부모
  • 인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능
  • 인터페이스를 메서드를 리턴타입으로 지정할 수 있다
abstract class Unit2 {
    int x, y;
    abstract void move(int x, int y);
    void stop() {
        System.out.println("멈춥니다.");
    }
}

interface Fightable { //인터페이스의 모든 메서드는 public abstract. 예외 없이
    void move (int x, int y); // public abstract가 생략됨
    void attack(Fightable f); // public abstract가 생략됨
}

class Fighter extends Unit2 implements Fightable{
    //오버라이딩 규칙: 조상(public) 보다 접근제어자가 좁으면 안된다.
    public void move (int x, int y) {
        System.out.println("["+x+","+y+"]로 이동");
    }
    public void attack(Fightable f){
        System.out.println(f+"를 공격");
    }

}

public class FighterTest {
    public static void main(String[] args) {
//      Fighter f = new Fighter();
        Unit2 u = new Fighter(); //Unit2에는 attack()이 없어서 호출불가
        Fightable f = new Fighter();
        u.move(100, 200);
//        u.attack(new Fighter());  //Unit2에는 attack()이 없어서 호출불가
        u.stop();

        f.move(100, 200);
        f.attack(new Fighter());
//        f.stop();                 //Fightable에는 stop()이 없어서 호출불가

    }
}

 

인터페이스의 장점

  • 두 대상(객체) 간의 '연결, 대화, 소통'을 돕는 '중간 역할'을 한다
  • GUI - Graphic User Interface
  • 선언(설계, 껍데기)와 구현(알맹이)을 분리시킬수 있게 함
    • 변경에 유리하고 유연한 코드가 됨
    • 인터페이스 덕분에 B가 변경되어도 A는 안바꿀 수 있게 됨 -> 느슨한 결합
    • 의존도가 낮아짐
  • 개발 시간 단축 가능
  • 변경에 유리한 유연한 설계 가능
  • 표준화가 가능
  • 서로 관계없는 클래스들을 관계를 맺어줄 수 있음
  • 다중상속 가능
class A{
    public void method(I i) { //인터페이스 I를 구현한 넘들만 들어와라
        i.method();
    }
}


// B클래스의 선언과 구현을 분
interface I {
    public  void method();
}

class B implements I{
    public void method(){
        System.out.println("B클래스의 메서드");
    }
}

class C implements I{
    public void method(){
        System.out.println("C클래스의 메서드");
    }
}

public class InterfaceTest {
    public static void main(String[] args) {
        A a = new A();
        a.method(new C()); // A가 B를 사용(의존)

    }
}

자바의정석 남궁성

 

추상클래스 (abstract class)

- 미완성 설계도, 미완성 메서드를 갖고 있는 클래스

- 추상메서드는 몸통{}이 없는 미완성 메서드

- 다른 클래스 작성에 도움을 주기 위한 것 -> 인스턴스 생성 불가

abstract class Player{
        abstract void play(int pos);  //추상메서드 (몸통{} 이 없는 미완성 메서드)
        abstract void stop();     // 추상메서드
}

- 상속을 통해 추상 메서드를 완성해야 인스턴스 생성가능

class AudioPlayer extends Player{
         void play(int pose) { /*내용 생략*/}  //추상메서드를 구현
         void stop() { /* 내용 생략*/ }             //추상메서드를 구현

 

추상 메서드(abstract method)

-미완성 메서드, 구현부 {}가 없는 메서드

abstract 리턴타입 메서드이름();

- 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우 사용

 

 

abstract class Player {  //추상 클래스
    abstract void play(int pos);  //추상 메서드
    abstract void stop();  //추상 메서드 (선언부만 있고 구현부{}가 없는 메서드)

}

//추상 클래스는 상속을 통해 완성해야 객체 생성가능
class AudioPlayer extends  Player {
    @Override
    void play(int pos) {
        System.out.println(pos+"위치부터 play 합니다");
    }

    @Override
    void stop() {
        System.out.println("재생을 멈춥니다.");
    }
}


public class PlayerTest {

    public static void main(String[] args) {
//        Player p = new Player(); // 추상 클래스의 객체를 생성
//        AudioPlayer ap = new AudioPlayer();
        Player ap = new AudioPlayer(); //다형성
        ap.play(100);
        ap.stop();
    }
}

 

추상클래스의 작성

- 여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존 클래스의 공통 부분을 뽑아서 추상클래스를 만든다


public class Ex7_10 {
    public static void main(String[] args) {
//        Unit[] group = new Unit[]{new Marine(), new Tank(), new Dropship()};
        Unit[] group = new Unit[3];
        group[0] = new Marine();
        group[1] = new Tank();
        group[2] = new Dropship();
        for(int i = 0; i < group.length; ++i)
            group[i].move(100, 200);
    }

}

abstract class Unit {
    int x, y;
    abstract void move(int x, int y);
    void stop() {/*현재 위치에 정지*/}
}

class Marine extends Unit { //보병
    void move(int x, int y) {
        System.out.println("Marine[x="+x+",y="+y+"]");
    }
    void stimPack() {/*스팀팩을 사용한다. */}
}

class Tank extends Unit { //탱크
    @Override
    void move(int x, int y) {
        System.out.println("Tank[x="+x+",y="+y+"]");
    }
    void changeMod() { /*공격모드를 변환한다.*/}
}

class Dropship extends Unit { //탱크
    @Override
    void move(int x, int y) {
        System.out.println("Dropship[x="+x+",y="+y+"]");
    }
    void change() { /*공격모드를 변환한다.*/}
}

- 추상화된 코드는 구체화된 코드보다 유연; 변경에 유리함

 

 

자바의 정석 기초편

instanceof 연산자

  • 참조변수의 형변환 가능여부 확인에 사용 -> 가능하면 true return
  • 형변환 전에 반드시 instanceof로 확인해야함
  • 참조변수 형변환은 왜?
    • -> 참조변수를 변경함으로써 사용할 수 있는 멤버의 갯수를 조절하기 위해서
    • 타입 일치시키려고

 

매개변수의 다형성

  • 다형적 매개변수
  • 하나의 배열로 여러종류 객채다루기
  • 참조형 매개변수는 메서드 호출시, 자신과 같튼 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.

 

여러 종류의 객체를 배열로 다루기

  • 조상타입의 배열에 자손들의 객체를 담을 수 있다

 

Vector class에는 모든 종류의 객체 저장 가능

object[]

 

동영상 예시를 보면 도움이 된다.

 

 

자바의 정석 기초편

접근 제어자(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();를 삽입한다.(조상의 기본 생성자)

 

 

자바의 정석

오버로딩(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 {}

 

 

 

 

 

 

자바의 정석 기초편

 

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()

 

 

 

 

+ Recent posts