본문 바로가기

etc/Concept

자바 기본 문법 공부..

반응형

오늘은 kotlin을 공부하던 도중...


자바 문법에 대해 갑자기 생각도 안나고 이걸 어떻게 설명해야하지? 라는 생각이 들어..


처음부터 다시 자바 문법 등에 대해 공부했습니다..


이게 코드를 보고 시작한 케이스의 단점인데.. 구글링 등은 빠르나 기본 문법의 사용이나 어떤게 어떤식으로 작동하는지


등에 대한 "이론"이 부족해 추후 시니어 개발자로 성장하는데 어려움이 있을거 같아


제가 이해한 대로 작성했습니다.


이 부분은 계속해서 수정해 나갈 예정이고, 05월 10일 공부한 내용만 작성하겠습니다.


모두 "기본"이 충실한 개발자가 되시길 바랍니다!!!


----------------------------------------------------------


1. 변수
- Type name; => 변수의 자료형(Type)을 정하고 변수명(name)을 정할 수 있다.
- 자주 쓰이는 자료형 : int, long, double, boolean, char, String, StringBuffer, List, Map
- 사용자가 자료형을 정해서 사용 가능
    ex) class name {} => name choo; => choo 라는 변수는 name 자료형 변수

2. 자료형
- 숫자
    정수 : int / long
        long countLong = 8764827384923849L;  <= L(or l) 을 반드시 써줘야 함

    실수 : float / double
        float pi = 3.14F;           처럼 float 은 F(or f)를 꼭 붙여줘야 한다.
        double morePi = 3.14159265358979323846;
        double d1 = 1.234e2;        e2 은 10의 제곱을 의미

cf) String a = new String("hi"); 에서의 new 는 객체를 만들때 사용하는 키워드(새로 생성된 자료형)

- 문자열
    indexOf : 문자열에서 특정 문자가 시작되는 인덱스를 리턴
        ex) String a = "Hello java"; => indexOf("java") => 6(java 는 0부터 시작)
    replaceAll : 문자열 중 특정 문자를 다른 문자로 바꾸고 싶은 경우 사용
        ex) a.replaceAll("java", "world") => Hello world
    substring : 문자열 중 특정 부분을 뽑아낼 경우 사용
        ex) a.substring(0, 4) => Hell (시작점 <= a < 끝위치)
    toUpperCase : 문자열을 모두 대문자로 변경하고자 할 때 사용 (소문자 변경 : toLowerCase)
        ex) a.toUppercase() => HELLO JAVA

- StringBuffer vs String
    StringBuffer sb = new StringBuffer();
            sb.append("hello");
            sb.append(" ");
            sb.append("jump to java");
    String temp = "";
            temp += "hello";
            temp += " ";
            temp += "jump to java";
    두 가지의 결과 "sb.toString() == temp" 는 같지만, 내부적으로 객체가 생성되고 메모리가 사용되는 과정은 다르다.
    StringBuffer의 경우 new 로 선언할 시에 단 한번만 생성된다. 하지만 String 의 경우 자료형에 "+" 연산이 있을 때마다
    새로운 String 객체가 생성되 위 예제에서는 총 4개의 String 자료형 객체가 만들어지게 된다.
        cf) String 자료형은 한 번 값이 생성되면 그 값을 변경할 수 없다!!!
            -> toUpperCase 등의 메소드를 보면 문자열이 변경되는 것처럼 보이지만, 실제로는 또 다른 String 객체를 생성하여 리턴할 뿐!!!
        <-> StringBuffer 의 경우는 이와 반대로 한번 생성된 값을 언제든지 수정할 수 있다.

    StringBuffer : insert / substring 메소드 사용 가능

- 배열(Array) vs 리스트(List)
    배열(Array) : 크기가 정해져 있다.
    리스트(List) : 크기가 정해져 있지 않다.
        List 자료형에는 ArrayList, LinkedList 등의 List 인터페이스를 구현한 자료형이 있다.
        사용 메소드 : add(객체/인덱스, 객체), get(인덱스), size, contains(객체), remove(객체/인덱스)

- 제네릭스(Generics)
    List<String> list = new ArrayList<>(); => <String> 이라고 지정한 부분이 제네릭스이다. 이 부분 사용법은 따로 공부************
    ****참고 싸이트 : http://wonwoo.ml/index.php/post/174

- for each 문
    for (type var: iterate) {
        body-of-loop
    }
    위 iterate는 루프를 돌릴 객체이고 iterate 객체에서 한개씩 순차적으로 var에 대입되어 for문을 수행하게 된다.
    iterate부분에 들어가는 타입은 루프를 돌릴수 있는 형태인 배열 및 ArrayList 등이 가능하다.


--------------------------------------------------------------------------------


- Class
    public class Animal { String animalName; } => Animal cat = new Animal();
    new 는 객체를 생성할 때 사용. Animal Class의 Instance 인 cat, 즉 Animal의 객체를 만들 수 있다.

    ****객체 vs 인스턴스 => 클래스에 의해서 만들어진 "객체"를 "인스턴스"라고 함. cat이라는 객체는 Animal의 Instance.
        즉, 어떤 클래스의 객체인지를 "관계"위주로 설명할 때 인스턴스라는 말을 사용한다.
        "cat은 Instance 보다는 객체", "cat은 Animal의 객체 보다는 인스턴스"라는 표현이 맞다.

    즉, 쉽게 설명하자면 과자를 만드는 "틀"은 "Class"이고 "틀"에 의해 만들어진 "과자"는 "객체(Object)" 이다.

    animalName 은 "객체 변수, 인스턴스 변수, 멤버 변수, 속성" 이라고 말한다.

- Inheritance(상속) : 자식이 부모로부터 무언가를 물려받는 것
    사용 방법 : 자식class extends 부모class (public class Dog extends Animal{} => IS-A 관계(Dog is a Animal) => Animal dog = new Dog(); 가능)

    Method overriding vs overloading
        overriding : 부모 클래스의 메소드를 자식 클래스가 동일한 형태로 또 다시 구현하는 행위
        overloading : 입력항목이 다르고 동일한 이름의 메소드를 만드는 행위

- Constructor(생성자)
    규칙 : 클래스 명과 메소드 명이 동일 / 리턴타입을 정의하지 않음
    public class HouseDog extends Dog {
        public HouseDog() { }                   << Default Construct
        public HouseDog(String name) {          << Construct
            this.setName(name);
        }
        public HouseDog(int type) {          << Construct overloading
            if (type == 1) {
                this.setName("yorkshire");
            } else if (type == 2) {
                this.setName("bulldog");
            }
        }
    }

- Interface(인터페이스)*************
    예를 들어,

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

    이러한 경우 가지수가 얼마 안되기 때문에, 해당 동물마다 다른 먹이를 던져주는 메소드를 오버로딩 해서 만들면 된다.
    하지만, 동물의 수가 많아 질수록 먹이를 주는 메소드와 해당 동물을 정의한 class가 함께 늘어나기 때문에 더러운 코드가 된다..... 이를 해결하기 위한 것이 "인터페이스" 이다.
    인터페이스 안의 메소드는 메소드의 이름과 입출력에 대한 정의만 존재해야 한다. (규칙이다.)
    이 메소드는 인터페이스를 implements(implements 인터페이스) 한 곳에서 구현해 각자 필요한 "먹이"를 return 해주면 된다.
    즉, 육식 동물들의 종류만큼의 feed 메소드가 필요했던 ZooKeeper 클래스를 Predator 인터페이스를 이용하여 구현했더니 단 한개의 feed 메소드로 구현이 가능해졌다.
    여기서 중요한 점은 메소드의 갯수가 줄어들었다는 점이 아니라 ZooKeeper클래스가 동물들의 종류에 의존적인 클래스에서
    동물들의 종류와 상관없는 독립적인 클래스가 되었다는 점이다.
    바로 이 점이 "인터페이스의 핵심"이다.

    다른 예로써는, USB 포트(물리적 세계의 인터페이스)가 있다.
    위의 사육사가 어떤 육식 동물이던 상관없이 해당 먹이를 주는 것처럼 USB 포트만 컴퓨터에 구성되어 있지, 어떤 기기를 연결하든 신경쓸 필요가 없다.

- 다형성(Polymorphism, 폴리모피즘)
    하나의 객체가 여러 개의 자료형 타입을 가질 수 있는 것
    (예시는 점프 투 자바의 05-7 다형성)
    즉, Tiger tiger = new Tiger();   =   Animal animal = new Tiger();    =   Predator predator = new Tiger();    =   Barkable barkable = new Tiger();
        cf) 인터페이스는 일반 클래스와는 달리 extends 를 이용하여 여러개의 인터페이스(Predator, Barkable)를 동시에 상속할 수 있다.
        즉, 다중 상속이 지원된다. (※ 일반 클래스는 단일상속만 가능하다.))

- 접근제어자(Access Modifier) => 메소드 또는 변수, inner class 에 설정 가능
    private : 해당 class 내에서만 접근 가능
    default : 해당 package 내에서만 접근이 가능
    protected : 동일 package 내의 class 또는 해당 class 를 상속받은 외부 package 의 class 에서 접근 가능
    public : 어떤 class 에서라도 접근이 가능

- static 변수
    항상 값이 변하지 않는 경우에 사용해 메모리 할당을 딱 1번만 하게 만들어, 사용하지 않을 시의 호출 시마다 메모리를 별도 할당해야 하는 것을 방지한다.
    static을 사용하는 또 한가지 이유로 공유의 개념을 들 수 있다.
    static 으로 설정하면 같은 곳의 메모리 주소만을 바라보기 때문에 static 변수의 값을 공유하게 되는 것이다.

- static method
    스태틱 메소드 안에서는 인스턴스 변수 접근이 불가능 하다. (static 변수는 접근 가능)
    보통 스태틱 메소드는 유틸리티 성 메소드를 작성할 때 많이 사용된다.(예제 : https://wikidocs.net/228)
    예를 들어 "오늘의 날짜 구하기", "숫자에 콤마 추가하기"등의 메소드를 작성할 때에는 클래스 메소드를 사용하는 것이 유리하다.

- singleton pattern
    단 하나의 객체만을 생성하게 강제하는 패턴
    클래스를 통해 생성할 수 있는 객체는 Only One, 즉 한 개만 되도록 만드는 것

    ****** ※ 위에서 예제로 든 싱글톤은 Thread Safe 하지는 않다. 쓰레드 환경에서도 안전한 싱글톤을 만드는 방법은 공부!!!!!!!!!!!!

- final
    한번 설정되면 그 값을 변경하지 못하게 하는 기능! 변경 시 예외!!! 발생

이런 식으로 공부했고 이해했습니다.


제가 잘 못 이해한 부분이나 틀린 설명의 경우 댓글을 달아주시면 수정하겠습니다!! 저도 공부하는 입장이니까요!


지적은 달게달게 받습니다.


저는 코드를 짜면서 StringBuffer를 거의 사용 안했는데, 이번 기회에 많이 사용해봐야겠네요.. 메모리에서 차이가 날 줄은 몰랐네요..


나중에 메모리 관련 공부도 해야겠어요!(제네릭스 사용법, interface와 추상클래스의 차이? 등은 아직 정확하게 인지를 못했네요)



--------------------이상 자바 기본 of 기기기기기본에 대한 공부였습니다.

이 부분에 대한 출처는 "점프 투 자바"를 참고했습니다.

반응형

'etc > Concept' 카테고리의 다른 글

객체지향 모델링 공부법 참고 싸이트  (0) 2018.12.11
객체지향 프로그래밍이란?  (0) 2018.09.27
Activity와 Fragment Lifecycle 참고 싸이트  (0) 2018.05.28
DTO란?  (0) 2018.05.12