9 분 소요

자바 기초 문법을 개인공부를 목적으로 정리한 글입니다.
자바의 정석 책 외의 위키독스의 “점프 투 자바”를 참고하여 작성했습니다. https://wikidocs.net/book/31



1. intro

public class StringExample {
    public static void main(String[] args) {
        System.out.println("Hello World!");
        System.out.println("굿굿");
    }
}
  • public : 메소드의 접근제어자, public은 누구나 이 메소드에 접근할 수 있다는 의미
  • class : 클래스 블록을 만드는 키워드
  • static : 메소드에 static 이 지정되어 있는 경우 이 메소드는 인스턴스 생성없이 실행 할 수 있음을 의미
    • static 키워드를 사용한 변수는 클래스가 메모리에 올라갈 때 자동으로 생성이 된다.
    • 인스턴스 생성 없이 바로 사용 가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 이용한다. 1
    • 값을 변경해 줄 경우 클래스 이름을 앞에 씀.
  • void : 메소드의 리턴값이 없음(void: 사전적으로 “텅 빈” 이라는 뜻)을 의미
  • return : 실행중인 메서드를 종료하고 호출한 곳으로 되돌아간다.
    • 반환타입이 void가 아닌 경우, 반드시 return문 필요
  • String[] : 문자열을 나타내는 자바의 자료형 ([]가 있으므로 한 개가 아닌 여러개의 값으로 이루어진 배열임을 의미)
  • args : String[] 자료형에 대한 변수명 (arguments의 약어)
    • args 대신 다른 이름을 사용해도 상관없다.
  • System.out.println : 표준출력으로 데이터를 보내는 자바의 내장 메소드로 println 메소드의 입력 문자열을 화면에 출력한다. (명령문; Statement)
  • main : 클래스를 실행할 수 있는 메소드
  • ; : 세미콜론, 문장이 종료되었음을 의미.
    • 문장의 마지막에 반드시 세미콜론이 있어야 한다.
  • // : 라인 주석 처리
  • /* */ : 블록 주석 처리
  • 클래스명은 소스파일의 이름(클래스명.java)과 동일하게 사용해야 한다.
    • 클래스 블록은 중괄호 {} 로 둘러싸여 있다.
  • 메소드명은 원하는 이름으로 지울 수 있다.
    • 메소드 명 이후의 괄호()안의 값들은 메소드의 입력 인자를 뜻한다.
    • 입력 인자는 “입력자료형” + “입력변수명” 형태로 이루어 진다.
    • 메소드 블록은 중괄호 {}로 둘러싸여 있다.



변수와 자료형

  • 변수(variable) : 하나의 값을 저장하기 위한 메모리 공간
  • 변수명 규칙
    • 변수명은 숫자로 시작할 수 없다.
    • _$ 문자 이외의 특수문자는 사용할 수 없다.
    • 자바의 키워드는 변수명으로 사용할 수 없다. (예:int, class, return 등)
  • 상수(constant) : 한 번만 값을 저장 가능한 변수 (final)
  • 리터럴(literal) : 그 자체로 값을 의미하는 것
int a;
String b;

a = 1;
b = "hello java";
  • 클래스명 규칙
    • 클래스명은 명사로 한다.
    • 여러개의 단어가 섞이는 경우 각 단어의 첫번째 문자는 대문자이어야 한다.
  • 메소드명 규칙
    • 메소드명은 동사로 한다.
    • 클래스명과 마찬가지로 여러 개의 단어가 섞이는 경우 각 단어의 첫번째 문자는 대문자이어야 한다. 단, 처음 시작하는 문자는 항상 소문자로 시작해야 한다.
  • 변수명 규칙
    • 순서를 의미하는 임시적인 정수의 변수명은 i, j, k, m, n을 사용한다.
    • 변수명에 _, $ 기호를 사용할 수 있지만 시작 문자로 사용하지 않는다.



숫자

  • 정수 : int, long
  • 실수 : float, double
  • 8진수와 16진수는 int 자료형을 사용하여 표시한다.
    • 0으로 시작하면 8진수, 0x로 시작하면 16진수가 된다.
  • 숫자 연산 : +, -, *, /
    • % : 나머지 값 출력
  • 증감연산 : ++, --



불린

  • 불린(boolean) : 참 또는 거짓의 값을 갖는 자료형
    • true or false
  • 불린 연산은 조건문의 판단 기준으로 많이 사용된다.



문자

  • 한 개의 문자 값에 대한 자료형은 char를 이용
    • 문자값을 ' '로 감싸준다.
  • 문자열(문장)은 String으로 표현
  • new 키워드는 객체를 만들 때 사용
  • equals : 문자열의 값을 비교할 때
  • indexOf(문자) : 문자열에서 특정 문자가 시작되는 위치(인덱스)를 리턴
  • replaceAll(문자, 바꿀 문자) : 문자열 중 특정 문자열을 다른 문자열로 바꾸고자 할 때 사용
  • substring(시작위치, 끝위치) : 문자열 중 특정 부분을 뽑아낼 경우에 사용
  • toUpperCase : 문자열을 모두 대문자로 변경할 때
  • toLowerCase : 문자열을 모두 소문자로 변경할 때
public class TestString {

    public static void main(String[] args) {
        String a = "Hello Java";
        System.out.println(a); //Hello Java
        System.out.println(a.indexOf("Java")); //6
        System.out.println(a.replaceAll("Java", "World")); //Hello World
        System.out.println(a.substring(0,4)); //Hell
        System.out.println(a.toUpperCase()); //HELLO JAVA
    }
}



StringBuffer

  • StringBuffer : 문자열을 추가하거나 변경 할 때 주로 사용하는 자료형
  • append : 문자열 추가
    • += 로 문자열을 추가해 나갈 수 있음
  • toString() : String 자료형으로 변경
  • insert(위치, 넣을 문자) : 특정 위치에 원하는 문자열을 삽입



배열 (Array)

  • 배열 : 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간
  • int 자료형의 배열은 int[]로 표현
  • String 자료형의 배열은 String[]로 표현



리스트 (List)

  • 리스트는 크기가 정해져 있지 않고 동적으로 변한다는 점이다.
  • ArrayList는 List 자료형 중 가장 간단한 형태의 자료형이다.
    • ArraryList를 사용하기 위해서 import java.util.ArrayList를 먼저 불러온다.
  • add : 값 추가
  • add(넣을 위치, 값) : 넣을 위치를 지정해서 값 추가
  • get(위치) : 위치에 해당되는 값 가져옴
  • size() : ArrayList의 갯수를 리턴한다.
  • contains(값) : 리스트 안에 해당 값이 있는지 boolean으로 반환
  • remove(객체) : 리스트에서 객체에 해당되는 항목을 삭제하고 삭제한 결과(true, false)를 리턴한다.
  • remove(인덱스) : 해당 인덱스의 항목을 삭제하고 삭제된 항목을 리턴한다.
import java.util.ArrayList;

public class Sample {
    public static void main(String[] args) {
        ArrayList<String> pitches = new ArrayList<String>();
        pitches.add("138");
        pitches.add("129");
        pitches.add("142");

        System.out.println(pitches.get(1)); //129
        System.out.println(pitches.size()); //3
        System.out.println(pitches.contains("142")); //true

        System.out.println(pitches.remove("129")); //true
        System.out.println(pitches.size()); //2
        System.out.println(pitches.remove(0)); //138
    }
}



맵 (Map)

  • Map은 리스트나 배열처럼 순차적으로 해당 요소 값을 구하지 않고 key를 통해 value를 얻는다.
  • put(키, 값) 메소드를 통해 key와 value를 입력한다.
  • get(키) : key에 대응되는 value 값 출력
  • containsKey(키) : 해당 키가 있는지를 boolean 형태로 반환
  • remove(키) : 해당 키에 대응되는 아이템(key, value)을 삭제한 후 그 value 값을 반환
  • size() : Map의 갯수 리턴
/**
 * Sample
 */
import java.util.HashMap;

public class Sample {

    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("people", "사람");
        map.put("baseball", "야구");

        System.out.println(map.get("people")); //사람
        System.out.println(map.containsKey("people")); //true
        System.out.println(map.remove("people")); //사람
        System.out.println(map.size()); //1
    }    
}



제어문

if문

  • 조건이 true이면 if문 수행, false이면 else문 수행
if (조건문) {
    <수행할 문장1>
    <수행할 문장2>
    ...
} else {
    <수행할 문장A>
    <수행할 문장B>
    ...
}


비교연산자 설명
x < y x가 y보다 작다
x > y x가 y보다 크다
x == y x와 y가 같다
x != y x와 y가 같지 않다
x >= y x가 y보다 크거나 같다
x <= y x가 y보다 작거나 같다
x || y x와 y 둘 중 적어도 하나가 참이면 참이다
x && y x와 y 모두 참이어야 참이다
!x x가 거짓이면 참이다
  • else if (다중 조건 판단)
if (조건문) {
    <수행할 문장1> 
    <수행할 문장2>
    ...
}else if (조건문) {
    <수행할 문장1>
    <수행할 문장2>
    ...
} else {
   <수행할 문장1>
   <수행할 문장2>
   ... 
}



switch/case 문

switch(입력변수) {
    case 입력값1: ...
         break;
    case 입력값2: ...
         break;
    ...
    default: ...
         break;
}



while 문

while (조건문) {
    <수행할 문장1>
    <수행할 문장2>
    ...
}
  • break : while문 빠져 나가기
  • continue : while문 조건문으로 돌아가기



for 문

for (초기치; 조건문; 증가치){
  ...
}
  • break : for문 빠져 나가기
  • continue : for문 조건문으로 돌아가기


  • for-each 문
for (변수 : 배열레퍼런스)
    반복작업문

//예시
int[] a = {1,2,3,4,5};
        int sum = 0;
        for (int i: a)
            sum += i;
        System.out.println(sum); // 15



제어자(modifier)

  • 클래스와 클래스의 멤버에 부가적인 의미
  • 접근 제어자 : public, protected, (default), private
  • 그 외 : static, final, abstract, …
  • 하나의 대상에 여러 제어자를 같이 사용 가능 (접근 제어자는 오직 하나)
    • static : 클래스의, 공통적인
    • final : 마지막의, 변경될 수 없는
    • abstract : 추상의, 미완성의
      • 추상클래스를 상속받아서 완전한 클래스를 만든 후에 객체 생성 가능


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



객체지향 프로그래밍

public class Animal {

}
  • 클래스의 선언만 있고 내용이 없는 껍데기뿐인 클래스 (class=설계도)
  • 클래스
    1. 설계도
    2. 데이터 + 함수
    3. 사용정의 타입 (원하는 타입을 직접 만듦)
      • 객체(object)를 만드는 기능이 있다.
  • 객체 : 모든 인스턴스를 대표하는 일반적 용어
  • 인스턴스 : 특정 클래스로부터 생성된 객체
Animal cat = new Animal();


  • cat은 Animal의 instance이다.
    • 인스턴스는 특정 객체가 어떤 클래스의 객체인지를 관계위주로 설명할 때 사용된다.
  • 클래스에 의해 생성되는 것은 객체, 그 클래스에 선언된 변수는 객체 변수이다.
public class Animal {
    String name;
    
    public static void main(String[] args) {
        Animal cat = new Animal(); // cat이라는 객체 생성
        System.out.println(cat.name); //결과값 : null
        // name은 객체 변수
    }
}



메소드

  • 메소드는 클래스 내에 구현된 함수를 의미.
    1. 문장들을 묶어놓은 것 (작업단위로 문장들을 묶어서 이름 붙인 것)
    2. 값(입력)을 받아서 처리하고, 결과를 반환
  • 객체 변수에 값을 대입하는 방법
  • this는 클래스에 의해서 생성된 객체를 지칭한다. (여기서는 this==cat)
public class Animal {
    String name;
    
    public void setName(String name) { // String name : 입력 , void : 출력 (리턴값 X)
        this.name = name; // '객체.메소드'로 객체가 메소드를 호출 
    // setName 메소드의 입력으로 "body"와 같은 문자열을 전달해야 한다.
    }
    public static void main(String[] args) {
        Animal cat = new Animal();
        cat.setName("body"); // name에 body 문자열 전달
        System.out.println(cat.name); //body
    }
}



  • 클래스에서 가장 중요한 부분은 객체 변수의 값이 독립적으로 유지된다는 점이다.
public class Animal {
    String name;
    
    public void setName(String name) {
        this.name = name;
    }
    public static void main(String[] args) {
        Animal cat = new Animal();
        cat.setName("body");

        Animal dog = new Animal();
        dog.setName("happy");

        System.out.println(cat.name); //body
        System.out.println(dog.name); //happy
    }
}



  • return : 메소드의 결과 값을 돌려주는 명령어
  • 매개변수 : 메소드에 입력으로 전달된 값을 받는 변수
  • 인수 : 메소드를 호출할 때 전달하는 입력값
public 리턴자료형 메소드명(입력자료형1 매개변수1, 입력자료형2 매개변수2, ...) {
    ...    
    return 리턴값;  // 리턴자료형이 void 인 경우에는 return 문이 필요없다.
}


public class Sample {

    public int sum(int a, int b) { // a, b는 매개변수
        return a+b;
    }

    public static void main(String[] args) {
        int a = 3;
        int b = 4;

        Sample sample = new Sample();
        int c = sample.sum(a, b); // 3, 4는 인수

        System.out.println(c); // 7
    }
}
  • return을 단독으로 써서 메소드를 즉시 빠져나가는 경우가 있다.



상속

  • 자식 클래스가 부모 클래스의 기능을 그대로 물려받을 때
  • extends 키워드 사용
// Animal.java 파일
public class Animal {

    String name;

    public void setName(String name) {
        this.name = name;
    }
}


//Dog.java 파일
public class Dog extends Animal{
    public void sleep() {
        System.out.println(this.name+" zzz");
    }
    public static void main(String[] args) {
        Dog dog = new Dog(); 
        dog.setName("poppy");
        System.out.println(dog.name); //poppy
        dog.sleep(); //poppy zzz
    }
}



IS-A 관계

  • 위에 보았듯이 Dog is a Animal이라고 말할 수 있는 관계를 IS-A관계라 한다.
Animal dog = new Dog();  // 자식 클래스로 만든 객체는 부모 클래스의 자료형으로 사용할 수 있다.
//개로 만든 객체는 동물 자료형이다.



메소드 오버라이딩 (Method overriding)

  • HouseDog 클래스에 Dog 클래스와 동일한 형태의 sleep 메소드를 구현하면 HouseDog 클래스의 sleep 메소드가 Dog 클래스의 sleep 메소드보다 더 높은 우선순위를 갖게 되어 HouseDog 클래스의 sleep 메소드가 호출되게 된다.
  • 메소드 오버라이딩 : 부모클래스의 메소드를 자식클래스가 동일한 형태로 또다시 구현하는 행위
public class HouseDog extends Dog{
    public void sleep() {
        System.out.println(this.name+" zzz in house");
    }
    public static void main(String[] args) {
        HouseDog houseDog = new HouseDog();
        houseDog.setName("happy");
        houseDog.sleep(); //happy zzz in house
    }



메소드 오버로딩 (method overloading)

  • 입력항목이 다른 경우 동일한 이름의 메소드를 만들 수 있다.
  • 성립하기 위한 조건
    1. 메소드 이름이 같아야 한다.
    2. 매개변수의 개수 또는 타입이 달라야 한다.
    3. 반환 타입은 영향 없다.


public class HouseDog extends Dog{
    public void sleep(int hour) {
        System.out.println(this.name+" zzz in house for "+hour+" hours");
    }
    public static void main(String[] args) {
        HouseDog houseDog = new HouseDog();
        houseDog.setName("happy");
        houseDog.sleep(); //happy zzz in house
        houseDog.sleep(3); //happy zzz in house for 3 hours
    }
}


  • 다중 상속은 자바에서는 지원 X



생성자

  • 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메소드
  • 이름이 클래스 이름과 같아야 한다.
  • 리턴값이 없다.
public class HouseDog extends Dog{
    public void sleep(int hour) {
        System.out.println(this.name+" zzz in house for "+hour+" hours");
    }
    public static void main(String[] args) {
        HouseDog dog = new HouseDog();
        System.out.println(dog.name); //null
    }
}


  • 생성자(Constructor): 메소드명이 클래스명과 동일하고 리턴 자료형을 정의하지 않는 메소드
public class HouseDog extends Dog{
    public HouseDog(String name) {
        this.setName(name);
    }

    public void sleep(int hour) {
        System.out.println(this.name+" zzz in house for "+hour+" hours");
    }
    public static void main(String[] args) {
        HouseDog dog = new HouseDog("happy"); // new 키워드로 객체를 만들때 문자열을 전달해야만 한다.
        System.out.println(dog.name); //happy
    }
}



생성자 오버로딩

  • 하나의 클래스에 여러개의 입력항목이 다른 생성자를 만들 수 있다. (Overloading)
public class HouseDog extends Dog{
    public HouseDog(String name) {
        this.setName(name);
    }

    public HouseDog(int type) {
        if (type == 1) {
            this.setName("yorkshire");
        } else if (type == 2) {
            this.setName("bulldog");
        }
    }

    public void sleep() {
        System.out.println(this.name+" zzz in house");
    }

    public void sleep(int hour) {
        System.out.println(this.name+" zzz in house for "+hour+" hours");
    }
    public static void main(String[] args) {
        HouseDog happy = new HouseDog("happy"); // 문자열로 생성
        HouseDog yorkshire = new HouseDog(1); // 숫자값으로 생성
        System.out.println(happy.name); //happy
        System.out.println(yorkshire.name); //yorkshire
    }
}



인터페이스

  • 동물 사육사의 일을 정리
난 동물원의 사육사이다.
육식동물이 들어오면 난 먹이를 던져준다.
호랑이가 오면 사과를 던져준다.
사자가 오면 바나나를 던져준다.


// Animal.java
public class Animal {

    String name;

    public void setName(String name) {
        this.name = name;
    }
}


// Tiger.java
public class Tiger extends Animal{
    
}


// Lion.java
public class Lion extends Animal{
    
}


// ZooKeeper.java
public class ZooKeeper {
    public void feed(Tiger tiger) {
        System.out.println("feed apple");
    }
    public void feed(Lion lion) {
        System.out.println("feed banana");
    }

    public static void main(String[] args) {
        ZooKeeper zooKeeper = new ZooKeeper();
        Tiger tiger = new Tiger();
        Lion lion = new Lion();
        zooKeeper.feed(tiger); //feed apple
        zooKeeper.feed(lion); //feed banana
    }
}


-> 만약 다른 동물들이 더 늘어나고 관리해야 한다면? => 인터페이스로 해결하기!

// Predator.java
public interface Predator {
    
}


// Tiger.java
public class Tiger extends Animal implements Predator {
    
}


// Lion.java
public class Lion extends Animal implements Predator {
    
}


// Crocodile.java
public class Crocodile implements Predator {
    
}


// ZooKeeper.java
public class ZooKeeper {
    public void feed(Predator predator) {
        System.out.println("feed apple");
    }

    public static void main(String[] args) {
        ZooKeeper zooKeeper = new ZooKeeper();
        Tiger tiger = new Tiger();
        Lion lion = new Lion();
        Crocodile crocodile = new Crocodile();
        zooKeeper.feed(tiger); //feed apple
        zooKeeper.feed(lion); //feed apple
        zooKeeper.feed(crocodile); //feed apple
    }
}



인터페이스의 메소드

  • feed apple만 출력되는 문제 발생 -> 메소드를 이용하여 고쳐본다.
// Predator.java
public interface Predator {
    public String getFood();
}


// Tiger.java
public class Tiger extends Animal implements Predator {
    public String getFood() {
        return "apple";
    }
}


// Lion.java
public class Lion extends Animal implements Predator {
    public String getFood() {
        return "banana";
    }
}


// ZooKeeper.java
public class ZooKeeper {
    public void feed(Predator predator) {
        System.out.println("feed "+predator.getFood());
    }

    public static void main(String[] args) {
        ZooKeeper zooKeeper = new ZooKeeper();
        Tiger tiger = new Tiger();
        Lion lion = new Lion();
        zooKeeper.feed(tiger); //feed apple
        zooKeeper.feed(lion); //feed banana
    }
}



다향성

  • instanceof : 객체가 특정 클래스의 객체인지를 조사할 때 사용되는 자바의 내장 명령어
    • animal instanceof Tiger는 animal 객체가 new Tiger로 만드어진 객체인가?
  • 다형성(Polymorphism) : 하나의 객체가 여러개의 자료형 타입을 가질 수 있는 것
// Tiger 클래스의 객체 예시
Tiger tiger = new Tiger();  // Tiger is Tiger
Animal animal = new Tiger();  // Tiger is Animal
Predator predator = new Tiger();  // Tiger is Predator
Barkable barkable = new Tiger();  // Tiger is Barkable


// Bouncer.java
public class Bouncer {
    public void barkAnimal(Animal animal) {
        if (animal instanceof Tiger) {
            System.out.println("어흥");
        } else if (animal instanceof Lion) {
            System.out.println("으르렁");
        }
    }

    public static void main(String[] args) {
        Tiger tiger = new Tiger();
        Lion lion = new Lion();

        Bouncer bouncer = new Bouncer();
        bouncer.barkAnimal(tiger); //어흥
        bouncer.barkAnimal(lion); //으르렁
    }
}
  • 하지만 이와 같은 방법은 동물 객체가 추가될때마다 추가로 생성해줘야 한다. => 인터페이스로 해결!
// Barkable.java
public interface Barkable {
    public void bark();
}


// Tiger.java
public class Tiger extends Animal implements Predator, Barkable {
    public String getFood() {
        return "apple";
    }

    public void bark() {
        System.out.println("어흥")
    }
}


// Lion.java
public class Lion extends Animal implements Predator, Barkable {
    public String getFood() {
        return "banana";
    }

    public void bark() {
        System.out.println("으르렁")
    }
}



추상클래스

  • 추상클래스(Abstract Class) : 인터페이스 + 메소드
  • abstract 클래스를 상속하는 클래스에서 해당 abstract 메소드를 구현해야만 한다.
// Tiger.java
public class Tiger extends Predator implements Barkable {
    public String getFood() {
        return "apple";
    }

    public void bark() {
        System.out.println("어흥");
    }
}


public class Lion extends Predator implements Barkable {
    public String getFood() {
        return "banana";
    }

    public void bark() {
        System.out.println("으르렁")
    }
}




References

댓글남기기