728x90
You can not use .equals() to compare int.
But you can use == also to compare Integer.
Integer and int are different. Integer is a class and int is a primitive type.

public class IntegerToString {
    public static void main(String[] args) {
        // declare the Integer object
        Integer intValue = new Integer(100);
        // Declare the Object
        Object obj = new Integer(100);
        // test for equality
        if(intValue.equals(obj)){
            System.out.println("Integer is equals to the object.");
        }
        else{
            System.out.println("Not equal, something is wrong.");
        }
    }
}


결과 : Integer is equals to the object.


난독화 가이드에 String 비교시 == 를 사용하지 말라고 되어 있어서

if (deviceFound == null) {
대신에
if (!"".equals(deviceFound)) {
로 변경해서 난독화 하지 않은 상태로 시도했더니 에러가 발생한다.


즉, null 은 객체가 아니라서 equals 로 비교할 수가 없다.

!"".equals(deviceFound) 이 null 을 대신할 수는 없다는 것이다.


!"".equals(st)
형태로 많이 쓴다고 되어 있어서 테스트를 해봤는데 잘못된 정보다.

null 비교는 == 연산자를 사용하면 된다.


equals는 기본적으로 값 비교를 한다.
== 는 주소값을 비교한다.
String 객체를 == 연산자로 비교하면 '주소값' 을 비교한다.
비교 대상 중 primitive type(int) 의 변수가 하나라도 있다면, == 연산자는 값으로 비교한다.


private String IPSubnetMask(String msgArray){
    if(msgArray.contains("/")){
        String[] input_ipsubnet = msgArray.split("/"); // / 기호로 분리하라.
        String ipaddress = input_ipsubnet[0];
        String subnetMask = input_ipsubnet[1];
        if(IP_Validation.matcher(ipaddress).matches()) {
            if(Integer.parseInt(subnetMask)< 23) {
                return "3"; // 서브넷 마스크 확인 필요
            } else {
                return "1"; // 정상
            }
        } else {
            return "2"; // IP주소 비정상 입력
        }
    } else {
        return "0"; // 입력이 잘못되었다는 표시
    }
}


위 함수에서는 결과를 숫자가 아닌 문자 숫자로 반환하도록 했다.

String result = IPSubnetMask(ipsubnet);
if(result.equals("1")){

}

와 같이 equals 로 값 비교하면 된다.



'안드로이드 > Java 문법' 카테고리의 다른 글

[Java] Convert Month String to Integer  (0) 2019.10.14
Java ArrayList 함수 만들기  (0) 2019.10.02
공백으로 문자열 분리  (0) 2019.09.11
Java 제네릭(Generic)  (0) 2019.08.27
Java 추상 클래스  (0) 2019.08.19
블로그 이미지

Link2Me

,
728x90

자바에서 공백으로 문자열 분리하는 예제로 MIH 다음에 나오는 IP주소를 얻고 싶은 거다.

split(정규식) 을 사용해서 문자열을 분리해서 얻는다.

먼저 MIH 가 반드시 들어가는 줄인지 체크한 다음에 들어간 줄이면, MIH 이후의 문자열을 공백으로 분리해서 추출한 것과 바로 공백으로 구분해서 값을 추출했다.


public class Split_ex_01 {

    public static void main(String[] args) {
        String str ="    MIH     10.2.224.84      255.255.224.0 (19)   10.2.224.1       Intf(MIH)      ";
        str= str.trim(); // 문자열 앞뒤 공백 제거
        int stlocation = str.indexOf("MIH");
        int endlocation = str.length();
        String temp = str.substring(stlocation+3, endlocation).trim();
        System.out.println(temp);
        String[] part = temp.split("\\s{1,}"); // 공백으로 문자열 분리
        System.out.println(part[0]);
       
        String[] parts = str.split("\\s{1,}");
// 공백으로 문자열 분리       

        System.out.println(parts[1]);
    }
}


'안드로이드 > Java 문법' 카테고리의 다른 글

Java ArrayList 함수 만들기  (0) 2019.10.02
자바 null 비교, String 비교, 정수 비교  (0) 2019.09.20
Java 제네릭(Generic)  (0) 2019.08.27
Java 추상 클래스  (0) 2019.08.19
[Java] 다형성  (0) 2019.06.30
블로그 이미지

Link2Me

,
728x90

JDK 1.5 이전에서는 여러 타입을 사용하는 대부분의 클래스나 메소드에서 인수나 반환값으로 Object 타입을 사용했다.
이 경우에는 반환된 Object 객체를 다시 원하는 타입으로 타입 변환해야 한다.

그리고 원하지 않는 자료형이 입력되었을 때의 오류를 컴파일 시점에서 잡아낼 수 없다.

(Object 클래스는 모든 클래스의 조상(부모)이므로 모든 타입이 들어갈 수 있다.)


자바에서 제네릭(Generic)이란 데이터의 타입(Data Type)을 일반화한다(Generalize)는 것을 의미한다.
제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법이다.
이렇게 컴파일 시에 미리 타입 검사(Type Check)를 수행하면 다음과 같은 장점을 가진다.


1. 프로그램 성능저하를 유발하는 캐스팅(강제 데이터타입 변환)을 제거한다.

   - 매번 데이터 타입을 강제로 캐스팅하면, 프로그램 성능 저하가 발생한다.

2. 코드절약 및 코드 재사용성을 증진시켜 유지보수를 편하게 한다.

   - Generic 이 없다면, 매번 필요한 데이터 타입에 맞는 새로운 클래스 또는 메소드를 작성해야 한다.

3. 컴파일시 타입오류를 체크하여, 사전에 엄격한 데이터타입 체크를 가능케한다.



예제 1 

package ex_Generic;
//Object 타입을 사용하면 모든 종류의 자바 객체를 저장할 수 있다는 장점은 있지만
//저장할 때 타입 변환이 발생하고, 읽어올 때도 타입 변환이 발생한다.
//이러한 캐스팅이 빈번해지면 전체 프로그램 성능에 좋지 못한 결과가 발생할 수 있다.
// 제네릭은 클래스를 설계할 때 구체적인 타입을 명시하지 않고,
// 타입 파라미터로 대체했다가, 실제 클래스가 사용될 때 구체적인 타입을 지정함으로써 타입 변환을 최소화한다.
public class Box<T> { // T라는 이름이 매개변수화된 자료형임을 나타냄.
    private T item; // T에 해당하는 자료형의 이름은 인스턴스를 생성하는 순간에 결정된다.
    // T는 상징적인 문자
   
    public Box() { // 생성자
       
    }
   
    public Box(T item) { // 매개변수가 있는 생성자
        this.item = item;
    }
   
    public void setData(T item) { // T[] arr
        this.item = item;
    }
    public T getData() {
        return item;
    }
}

package ex_Generic;

import java.util.ArrayList;
import java.util.List;

abstract class Animal {
    public void go() {
        System.out.println("Animal");
    }
}
class Dog extends Animal {
    public void go() {
        System.out.println("Dog");
    }
}
class Cat extends Animal {
    public void go() {
        System.out.println("Cat");
    }
}

public class Main {
    @SuppressWarnings("unchecked")
    public static <T extends Animal> void doAction(List<T> animals) {
        animals.add((T) new Cat());
        for (Animal animal: animals) {
            animal.go();
        }
    }
       
    public static void main(String[] args) {
        // 한정된 타입을 사용하도록 유도함으로써 타입 안전성 보장
        // 인스턴스 생성시 자료형을 지정한다. Integer
        Box<Integer> box1 = new Box<>();
        box1.setData(10);
        System.out.println(box1.getData());
       
        // 인스턴스 생성시 자료형을 지정한다. String
        Box<String> box2 = new Box<>();
        box2.setData("오랜지");
        System.out.println(box2.getData());
       
        // 컬렉션 프레임워크(Collections Framework)
        // Collection : 객체를 수집해서 저장하는 역할
        // Framework : 사용방법을 미리 정해 놓은 라이브러리
        // List, Set, Map 인터페이스 구현 클래스가 존재
        // List : ArrayList, Vector, LinkedList
        // Set : HashSet, TreeSet
        // Map : HashMap, Hashtable, TreeMap, Properties
        List<String> list = new ArrayList<String>();
        list.add("사과");
       
        String str = list.get(0); // Type 을 변환하지 않는다.
        System.out.println(str);
       
        List<Dog> animals = new ArrayList<Dog>();
        animals.add(new Dog());
        animals.add(new Dog());
        //animals.add(new Cat()); // Cat을 넣으려고 하면 컴파일 시점에 타입 체크를 해주기 때문에 에러 발생
        doAction(animals);
   
    }

}


여러 블로그 자료를 참조하고 동영상 강좌를 들으면서 정리하고 있는데 아직 완벽한 이해는 못한 상태다.

기본 개념은 이 자료로 이해는 된다. 하지만 깊이 있게 들어가는 사항은 좀 더 테스트를 하고 이해해야 한다.

'안드로이드 > Java 문법' 카테고리의 다른 글

자바 null 비교, String 비교, 정수 비교  (0) 2019.09.20
공백으로 문자열 분리  (0) 2019.09.11
Java 추상 클래스  (0) 2019.08.19
[Java] 다형성  (0) 2019.06.30
How to validate IP address with regular expression  (0) 2019.06.17
블로그 이미지

Link2Me

,
728x90

추상 클래스
추상 클래스(abstract class)란 하나 이상의 추상 메소드(abstract method)를 포함하는 클래스이다.
- 추상 메소드는 선언만 있고 구현이 없는 메서드이며 선언부에 'abstract' 라는 키워드를 붙인다.
- 추상 메소드가 포함되었다면 클래스도 추상 클래스이므로 클래스명 앞에도 'abstract' 키워드를 붙여야 한다.
- 추상 클래스는 추상 메서드를 포함하고 객체화 할 수 없다는 점만 제외하고 일반 클래스와 다르지 않으며 생성자, 멤버변수와 일반 메서드를 가질 수 있다.
- 추상 클래스는 다른 클래스들에게서 공통으로 가져야하는 메소드들의 원형을 정의하고 그것을 상속받아서 구현토록 하는데 사용된다.
- 해당 추상클래스를 상속받는 자식 클래스들은 반드시 추상메서드를 상속받아 재정의(오버라이딩)해야 한다.


public abstract class 클래스명 {
  필드
  생성자
  메서드
  추상메서드
}


package ex_abstract;

public abstract class Animal {
    // 추상 클래스(abstract class)란 하나 이상의 추상 메소드(abstract method)를 포함하는 클래스
    // 추상 메소드가 포함되었다면 클래스도 추상 클래스이므로 클래스명 앞에도 'abstract' 키워드를 붙여야 한다.
    public String aType;
    public void move() {
        System.out.println("동물이 어슬렁 어슬렁 움직인다.");
    }
    abstract void sound(); // 추상(abstract) 메서드는 선언만 있고 구현이 없는 메서드
}

package ex_abstract;

public class Dog extends Animal {
    public void move() {
        System.out.println("노곤하개");
    }
   
    @Override
    void sound() {

        // 추상클래스를 상속받는 자식 클래스들은 반드시 추상메서드를 상속받아 재정의(오버라이딩)해야한다.

        System.out.println("노곤하개 컹컹");
    }
}

package ex_abstract;

public class Cat extends Animal  {
   
    public Cat() {
        this.aType ="고양이과 동물";
    }

    @Override
    void sound() {
        // 추상클래스를 상속받는 자식 클래스들은 반드시 추상메서드를 상속받아 재정의(오버라이딩)해야한다.
        System.out.println("고양이 냐옹");
    }

}

package ex_abstract;

public class Main {

    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();
        dog.move(); // 오버라이드된 메소드 호출 ==> 노곤하개
        cat.move(); // 추상클래스 메소드 호출 ==> 동물이 어슬렁 어슬렁 거린다.
        dog.sound(); // 자식 클래스의 구현된 메소드 호출 ==> 노곤하개 컹컹
        cat.sound(); // 자식 클래스의 구현된 메소드 호출 ==> 고양이 냐옹
    }
}


ㅇ 부모 클래스의 생성자를 호출하려면 super 키워드를 사용해야 한다.

package ex_abstract;

public abstract class Animal {
    // 추상 클래스(abstract class)란 하나 이상의 추상 메소드(abstract method)를 포함하는 클래스
    // 추상 메소드가 포함되었다면 클래스도 추상 클래스이므로 클래스명 앞에도 'abstract' 키워드를 붙여야 한다.
    public String name;
   
    public Animal() {
        super();
    }
    public Animal(String name) {
        this.name = name;
    }
    public void move() {
        System.out.println("동물이 어슬렁 어슬렁 움직인다.");
    }
    abstract void sound(); // 추상(abstract) 메서드는 선언만 있고 구현이 없는 메서드
}

package ex_abstract;

public class Cat extends Animal  {
   
    public Cat(String name) {
        super(name); // 부모 클래스의 생성자를 호출하려면 super 키워드를 사용해야 한다.
    }

    @Override
    void sound() {
        // 추상클래스를 상속받는 자식 클래스들은 반드시 추상메서드를 상속받아 재정의(오버라이딩)해야한다.
        System.out.println("고양이 냐옹");
    }

}

package ex_abstract;

public class Dog extends Animal {
   
    public Dog() {
        super(); // 부모 클래스의 생성자를 호출하려면 super 키워드를 사용해야 한다.
    }

    public Dog(String name) {
        super(name); // 부모 클래스의 생성자를 호출하려면 super 키워드를 사용해야 한다.
    }

    public void move() {
        System.out.println("노곤하개");
    }
   
    @Override
    void sound() {
        // 추상클래스를 상속받는 자식 클래스들은 반드시 추상메서드를 상속받아 재정의(오버라이딩)해야한다.
        System.out.println("노곤하개 컹컹");
    }
}

package ex_abstract;

public class Main {

    public static void main(String[] args) {
        Dog dog = new Dog("송백구");
        Cat cat = new Cat("조나비");
        dog.move(); // 오버라이드된 메소드 호출
        cat.move(); // 추상클래스 메소드 호출
        dog.sound(); // 자식 클래스의 구현된 메소드 호출
        cat.sound(); // 자식 클래스의 구현된 메소드 호출
        System.out.println("고양이의 이름은 : " + cat.name);
        System.out.println("진돗개의 이름은 : " + dog.name);
    }
}


'안드로이드 > Java 문법' 카테고리의 다른 글

공백으로 문자열 분리  (0) 2019.09.11
Java 제네릭(Generic)  (0) 2019.08.27
[Java] 다형성  (0) 2019.06.30
How to validate IP address with regular expression  (0) 2019.06.17
자바 클래스 개념 이해 예제  (0) 2019.05.27
블로그 이미지

Link2Me

,
728x90

"자바로 배우는 자료구조" 동영상 강의를 듣고 있다.

"자료구조와 함께 배우는 알고리즘 입문" 자바편 책과는 무관하다.

처음에는 이 책의 동영상 강의인줄 알고 찾아서 듣기 시작했는데, 강의를 들으면서 내가 몰랐던 부분, 놓치고 있던 부분 등을 알 수 있어 많은 도움이 된다.


다형성이 자바의 핵심이라고 하면서 C++과 가장 다른 점이라고 강조를 한다.

동영상 강의를 들을 때는 알 거 같은데 막상 뒤돌아서면 머리속에 남는게 없다. 아직 내 것으로 만들지 못해서다.

자바의 정석 책을 꺼내서 다형성 부분을 살펴보니까 강의에서 했던 내용이랑 거의 비슷하게 설명이 잘 되어 있다.


- 수퍼클래스 타입의 참조변수가 서브클래스 타입의 객체를 참조할 수 있다.

   Computer test = new Notebook();



출처: https://link2me.tistory.com/1269?category=942905 [소소한 일상 및 업무TIP 다루기]

- 수퍼클래스 타입의 참조변수가 서브클래스 타입의 객체를 참조할 수 있다.

   Computer test = new Notebook();



출처: https://link2me.tistory.com/1269?category=942905 [소소한 일상 및 업무TIP 다루기]

다형성(Polymorphism)

- 수퍼클래스 타입의 참조변수가 서브클래스 타입의 객체를 참조할 수 있다.

   Computer test = new Notebook();



출처: https://link2me.tistory.com/1269?category=942905 [소소한 일상 및 업무TIP 다루기]

다형성(Polymorphism)

- 수퍼클래스 타입의 참조변수가 서브클래스 타입의 객체를 참조할 수 있다.

   Computer test = new Notebook();



출처: https://link2me.tistory.com/1269?category=942905 [소소한 일상 및 업무TIP 다루기]
지금까지 우리는 생성된 인스턴스를 다루기 위해서, 인스턴스의 타입과 일치하는 타입의 참조변수만을 사용했다.

Notebook notebook = new Notebook();

Computer computer = new Computer();



수퍼 클래스 타입의 참조변수로 서브 클래스 타입의 객체를 참조할 수 있다. (동영상 강의)

조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조할 수 있도록 하였다. (자바의 정석)


클래스가 상속관계에 있는 경우 조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조하는 것도 가능하다.

Computer test = new Notebook();


반대로 자손 타입의 참조변수로 조상 타입의 인스턴스를 참조하는 것은 불가능하다.

참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다.


아래 예제는 생활코딩 강좌와 자바의 자료구조 강좌를 혼용하여 작성했다.

생활코딩 강좌가 개념을 좀 더 명확하게 해주는 거 같기는 하다. 자바 자료구조 강좌가 실제 코딩에 좀 더 접근한 설명으로 도움이 되는 부분도 있고 둘 다 들어보면 좋을 거 같다.


package section2;

class A {
    public String x() {    return "A.x"; }
}

class B extends A {
    String screensize ="1920";
    public String x() {
        String result = super.x() + "/" + screensize;
        return result;
    }

    public String y() { return "y"; }
}

class B2 extends A {
    public String x() { return "B2.x"; }
}

interface I1 {
    public String A();
}

interface I2 {
    public String B();
}

class C implements I1, I2 {

    @Override
    public String B() { return "B"; }

    @Override
    public String A() { return "A";    }
}

public class PolymorphismDemo1 {

    public static void main(String[] args) {
        A obj = new B();
        // 수퍼 클래스(조상) 타입의 참조변수로 서브 클래스(자손) 타입의 객체를 참조할 수 있다.
        // 반대로 자손 타입의 참조변수로 조상 타입의 인스턴스를 참조하는 것은 불가능하다.
        System.out.println(obj.x()); // 출력 : A.x/1920, dynamic binding
        // 클래스 B를 클래스 A의 데이터 타입으로 인스턴스화 했을 때,

        // 클래스 A에 존재하는 맴버만이 클래스 B의 맴버가 된다.
        // 동시에 클래스 B에서 오버라이딩한 맴버의 동작방식은 그대로 유지한다.
        //obj.y(); // 존재하지 않는 메소드처럼 실행되지 않는다.
       
        A obj2 = new B2();
        System.out.println(obj2.x()); // 출력 : B2.x, 두 인스턴스의 메소드 x를 호출한 결과는 서로 다르다.
       
        C obj3 = new C();
        I1 objI1 = new C();
        I2 objI2 = new C();

        System.out.println(obj3.A()); // 출력 : A
        System.out.println(obj3.B()); // 출력 : B
        System.out.println(objI1.A()); // 출력 : A
        System.out.println(objI2.B()); // 출력 : B
    }

}





'안드로이드 > Java 문법' 카테고리의 다른 글

Java 제네릭(Generic)  (0) 2019.08.27
Java 추상 클래스  (0) 2019.08.19
How to validate IP address with regular expression  (0) 2019.06.17
자바 클래스 개념 이해 예제  (0) 2019.05.27
자바 Arraylist  (0) 2019.05.26
블로그 이미지

Link2Me

,
728x90

How to alidate IP address with regular expression


IP 주소와 Subnet Mask 입력이 잘못된 것인지 체크하는 메소드를 작성해봤다.


import java.util.regex.Pattern;

public class Validation {

    public static void main(String[] args) {
       
        String inputValue = "10.10.10.256/21";
        String result = IPSubnetMask(inputValue);
        if(result.equals("1")){
            System.out.println("IP 주소와 서브넷 마스크를 정상적으로 입력했습니다.");
        } else if(result.equals("2")){
            System.out.println("ip 주소 입력이 잘못되었습니다.");
        } else if(result.equals("3")){
            System.out.println("서브넷 마스크가 맞나요?");
        } else {
            System.out.println("IP 주소와 서브넷 마스크 입력 정보를 확인하세요.");
        }       

    }
   
    private static String IPSubnetMask(String masArray){
        if(masArray.contains("/")){
            String[] input_ipsubnet = masArray.split("/"); // / 기호로 분리하라.
            String ipaddress = input_ipsubnet[0];
            String subnetMask = input_ipsubnet[1];
            System.out.println("ipaddress :" + ipaddress + ", subnetMask : " + subnetMask);
            if(IP_Validation.matcher(ipaddress).matches()) {
                if(Integer.parseInt(subnetMask)< 23) {
                    return "3"; // 서브넷 마스크 확인 필요
                } else {
                    return "1"; // 정상
                }               
            } else {
                return "2"; // IP주소 입력 체크
            }
        } else {
            return "0";
        }
    }
   
    private static final Pattern IP_Validation =
            Pattern.compile("^((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[0-9])\\.){0,3}"+
                    "((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[0-9])){0,1}$");
   
}
 





'안드로이드 > Java 문법' 카테고리의 다른 글

Java 추상 클래스  (0) 2019.08.19
[Java] 다형성  (0) 2019.06.30
자바 클래스 개념 이해 예제  (0) 2019.05.27
자바 Arraylist  (0) 2019.05.26
Java BubbleSort  (0) 2019.05.13
블로그 이미지

Link2Me

,
728x90

인프런 사이트에서 "Java로 배우는 자료구조" 강의를 듣고 있는데 강사가 설명을 너무 잘해준다.

기본기를 탄탄히 다지지 않은 상태에서 코딩을 배우다보니 기초가 부족하고 응용 하려고 할 때 시간을 많이 낭비한다.

튼튼한 기초를 쌓는것이 필요하여 강좌를 열심히 듣고 있다.

 

public class Code01 {
    public static void main(String[] args) {
        // 클래스는 결국 하나의 타입이다. 마치 int, double 등 처럼.
        // 사용자가 정의한 새로운 타입이라는 의미에서 "사용자 정의 타입"이라고 부르기도 한다.
        // Person1 의 변수를 선언하고 사용한다.
        Person1 fst = new Person1();
        // fst 라는 변수가 만들어지지만 그 "안"에 사람이름과 전화번호가 저장되지는 않는다.
        // 이름과 전화번호를 저장할 Person1 객체는 new 명령으로 따로 만들어야 하고 변수 fst에는 그 객체의 주소(참조)를 저장할 수 있다.
        // 모든 프리미티브 타입(프로그램 자체가 기본적으로 제공해주는 타입)의 변수는 보통 변수이다. 즉 변수 자체에 값이 저장된다.
        // 프리미티브 타입이 아닌 모든 변수는 참조 변수이다.
        // 즉 실제 데이터가 저장될 "객체"는 new 명령으로 따로 만들어야 하고, 참조 변수에는 그 객체의 주소를 저장한다.
        // new 로 객체를 생성하면 이름을 가질 수 없다. 그래서 참조 변수가 필요하다.
        // 객체를 만들기 전에는 참조변수를 참조할 수 없다.
        fst.name = "John";
        fst.number = "010-1111-5555";
 
        System.out.println("Name :" + fst.name + ", Number : " + fst.number);
 
        Person1 snd = fst; // fst와 snd는 동일한 객체를 참조
        snd.name = "Tom";
        System.out.println("Name :" + fst.name + ", Number : " + fst.number);
        System.out.println("Name :" + snd.name + ", Number : " + snd.number);
 
        Person1 [] members = new Person1[100];
        members[0= fst;
        members[1= snd;
        members[2= new Person1(); // members[2]은 참조변수
        members[2].name = "데이비드";
        members[2].number ="010-2225-8789";
 
        System.out.println("First is " + members[0].name + " wiht mumber " + members[0].number);
        System.out.println("Second is " + members[1].name + " wiht mumber " + members[1].number);
        System.out.println("Third is " + members[2].name + " wiht mumber " + members[2].number);
 
    }
 
}
 
class Person1 {
    String name;
    String number;
}
 
 
cs

 

 

자바의 정석 동영상 강좌를 듣고, Android 앱을 구글링과 설계 로직을 구현 및 초보 실전 코딩을 하면서 기초가 강해야 한다는 걸 절실히 느낀다.

 

클래스 개념 이해 예제

// 클래스 : 객체(변수 + 메소드)를 정의해 놓은 것
// ① 설계도 ② 데이터 + 함수 ③ 사용자 정의 타입
// 클래스가 필요한 이유는 ? 객체를 생성하기 위해
class Tv {
    // Tv의 속성(멤버변수)
    String color;           // 색상
    boolean power;             // 전원상태(on/off)
    int channel;               // 채널
 
    // Tv의 기능(메서드)
    void power()   { // TV를 켜거나 끄는 기능을 하는 메서드
        power = !power;
    }
    void channelUp() { // TV의 채널을 높이는 기능을 하는 메서드
        ++channel;
    }
    void channelDown() { // TV의 채널을 낮추는 기능을 하는 메서드
        --channel;
    }
}
 
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;
    }
}
 
// 하나의 소스 파일에는 하나의 public class 만 허용한다.
// 파일명은 public class 명과 일치한다.
public class ClassEX1 {
    public static void main(String[] args) {
        Tv t1;                 // Tv인스턴스를 참조하기 위한 변수 t를 선언
        t1 = new Tv();         // Tv인스턴스(객체)를 생성한다.
        System.out.println("t1 channel값은 " + t1.channel + "입니다.");
        t1.channel = 7;        // Tv인스턴스의 멤버변수 channel의 값을 7로 한다.
        System.out.println("t1의 channel값을 "+t1.channel+"로 변경하였습니다.");
        t1.channelDown();      // Tv인스턴스의 메서드 channelDown()을 호출한다.
        System.out.println("t1의 현재 채널은 " + t1.channel + " 입니다.");
 
        Tv t2 = new Tv();
        System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
 
        t2 = t1; // t2 에 t1의 참조변수를 할당하라. 즉 t1의 참조변수가 가리키는 주소를 t2에 할당(대입)하라.
        // t2 에 원래 할당했던 주소의 객체와는 연결이 끊어진다.
        // t2 가 가리키는 객체의 주소가 0x200 이라고 하면
        // 0X200번지의 객체를 GC(Garbage Collector)가 자동으로 메모리에서 제거한다. (memory leak 방지)
        System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
 
        System.out.println();
 
        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 Data {
    int x;
 
    public Data() { // 기본(default) 생성자
    }
    // 기본 생성자를 생략하면 컴파일러가 자동으로 추가해준다.
}
class Data2 { int x; }
class Data3 { int x; }
 
public class ClassEX2 {
    private static void change(int x) {
        // 기본형 매개변수는 값을 읽기만 한다.
        x = 1000;
        System.out.println("change() : x = " + x);
    }
 
    private static void change(Data2 d) { // 참조형 매개변수
        // 참조형 매개변수는 값을 읽고 쓸 수 있다.
        d.x = 1000;
        System.out.println("change() : x = " + d.x);
    }
 
    static Data3 copy(Data3 d) {
        Data3 tmp = new Data3();    // 새로운 객체 tmp를 생성한다.
        tmp.x = d.x;  // d.x의 값을 tmp.x에 복사한다.
        return tmp;   // 복사한 객체의 주소를 반환한다.
    }
 
    public static void main(String[] args) {
        System.out.println("기본형 매개변수 객체 생성의 값 변화");
        Data d = new Data();
        // 참조변수 d는 스택영역에 생성되고, new Data() 객체는 Heap 영역에 생성된다.
        // 참조변수 d에 Heap 영역에 생성된 객체의 주소를 할당한다.
        System.out.println("main() : x = " + d.x);
        d.x = 10;
        System.out.println("main() : x = " + d.x);
 
        change(d.x);
        System.out.println("After change(d.x)");
        System.out.println("main() : x = " + d.x);
 
        System.out.println();
 
        System.out.println("참조형 매개변수 객체 생성의 값 변화");
        Data2 d2 = new Data2();
        System.out.println("main() : x = " + d2.x);
        d2.x = 10;
        System.out.println("main() : x = " + d2.x);
 
        change(d2);
        System.out.println("After change(d2)");
        System.out.println("main() : x = " + d2.x);
 
        System.out.println();
 
        Data3 d3 = new Data3();
        d3.x = 10;
 
        Data3 d4 = copy(d3);
        System.out.println("d3.x ="+d3.x);
        System.out.println("d4.x="+d4.x);
    }
 
}
 

 

Object 타입 Integer 예제

public class ClassEX3 {
    public static void main(String[] args) {
        Integer a = 10// Integer 는 Object 타입
        System.out.println("Before: " + a);
        changeInteger(a);
        System.out.println("After: " + a);
 
        System.out.println();
 
        String s = "hello";
        changeString(s);
        System.out.println(s);
    }
 
    // 자바에서 Wrapper class 에 해당하는
    // Integer, Character, Byte, Boolean, Long, Double, Float, Short 클래스는 모두 Immutable 이다.
    // 그래서 heap 에 있는 같은 오브젝트를 레퍼런스 하고 있는 경우라도,
    // 새로운 연산이 적용되는 순간 새로운 오브젝트가 heap 에 새롭게 할당된다.
    //  Immutable Object 는 불변객체로써, 값이 변하지 않는다.
    //  변경하는 연산이 수행되면 변경하는 것 처럼 보이더라도 실제 메모리에는 새로운 객체가 할당되는 것이다.
    private static void changeInteger(Integer a) {
        a += 10;
    }
 
    public static void changeString(String param) {
        param += " world";
    }
}
 
 

 

 

'안드로이드 > Java 문법' 카테고리의 다른 글

[Java] 다형성  (0) 2019.06.30
How to validate IP address with regular expression  (0) 2019.06.17
자바 Arraylist  (0) 2019.05.26
Java BubbleSort  (0) 2019.05.13
java Singleton Design Pattern  (0) 2018.09.24
블로그 이미지

Link2Me

,
728x90

Arraylist 에 대한 기능을 테스트하고 적어둔다.

VSCode 에서 자바 Extension을 설치하고 테스트해봤는데 아직은 Eclispe 만큼 만족스럽지 못하더라.


중복 저장은 배제하고 지정한 개수만큼만 ArrayList 에 저장하는 로직이다.

1. 자료 입력이 들어오면 중복 검사를 한다.

2. 중복된 값이 없으면 저장한다.

3. 특정 개수 이상이면 최초 등록한 걸 지워라.


import java.util.ArrayList;
import java.util.Collections;

public class MyArrayList {
    static ArrayList<String> cars = new ArrayList<String>();
    static int Max = 3;
    
    public static void main(String[] args) {
        
        ItemAdd("Volvo");
        ItemAdd("BMW");
        ItemAdd("Ford");
        ItemAdd("Mazda");
        ItemAdd("KIA K5");
        
        //Collections.sort(cars);  // Sort cars
        //System.out.println(cars.contains("Ford")); // 값의 존재 여부 출력
        System.out.println(cars); // 배열 출력
        
        System.out.println("Arraylist 출력");
        for(int i=0; i < cars.size();i++) {
            System.out.println(cars.get(i));
        }

        cars.get(0); // 가져오기
        cars.set(0, "Opel"); // 변경하기
        System.out.println(cars); // 변경된 배열 출력
        
    }
    
    public static void ItemAdd(String str) {
        if(!cars.contains(str)) { // 중복 여부 검사
            cars.add(str); // 중복이 없으면 저장
        }
        if(cars.size()> Max) { // 특정 개수 이상이면
            cars.remove(0); // 가장 먼저 등록한 걸 지워라.
        }
    }
}



'안드로이드 > Java 문법' 카테고리의 다른 글

How to validate IP address with regular expression  (0) 2019.06.17
자바 클래스 개념 이해 예제  (0) 2019.05.27
Java BubbleSort  (0) 2019.05.13
java Singleton Design Pattern  (0) 2018.09.24
[Java] instanceof 연산자  (0) 2017.10.24
블로그 이미지

Link2Me

,
728x90

버블 정렬은 시간복잡도가 n의 제곱으로 늘어나기 때문에 시간이 굉장히 오래 걸린다.
정렬에 걸리는 시간은 오래 걸리지만 알고리즘이 단순하기 때문에 자주 사용된다.




class BubbleSort {
    public static void main(String[] args) {
        int[] data = {25,3,21,64,65,78,9,5,76,34,8,32,76};
        // bubble sort
        int n = data.length;
        for(int i = n-1; i>0; i--){
            for(int j=0; j < i; j++){
                if(data[j] > data[j+1]){ // 첫번째 수가 더 크면 데이터를 서로 교체하라.
                    int tmp = data[j]; // 첫번째 수를 임시 저장
                    data[j] = data[j+1];
                    data[j+1] = tmp;
                }
            }
        }

        System.out.print("\n\n====== Sorted Data =========\n");
        for(int k=0; k<n;k++)
            System.out.print(data[k] + ", ");

    }
}


문자열 버블 정렬

static void bubbleSort(){
    for(int i = n-1; i>0; i++){
        for(int j=0; j<i; j++){
            if(name[j].compareTo(name[j+1]) > 0){
                Strimg tmp = name[j];
                name[j] = name[j+1];
                name[j+1] = tmp;
            }
        }
    }
}


'안드로이드 > Java 문법' 카테고리의 다른 글

자바 클래스 개념 이해 예제  (0) 2019.05.27
자바 Arraylist  (0) 2019.05.26
java Singleton Design Pattern  (0) 2018.09.24
[Java] instanceof 연산자  (0) 2017.10.24
Java static 변수 이해하기  (0) 2017.10.20
블로그 이미지

Link2Me

,
728x90

Singleton Design Pattern is basically used when we want to limit object creation.
최초 한번만 메모리를 할당하고(static) 그 메모리를 인스턴스로 만들어 사용하는 디자인 패턴.
싱글톤(singleton)은 단독 객체라는 의미를 가진 영단어로, 단 하나의 객체만 만들어야 할 경우 필요하다.
싱글톤 패턴은 하나의 인스턴스만을 재사용하게 된다. 따라서 객체를 여러 번 생성할 필요가 없는 경우에 싱글톤을 사용하면 불필요한 자원 낭비나 오버헤드 등을 막을 수 있다.


class 클래스  {

    // 정적 필드

    // 자신의 클래스 타입으로 정적(static) 필드를 선언하고 자신의 인스턴스를 생성하여 초기화를 한다.

    // 전역 변수로 instance를 만드는데 private static을 이용한다.

   // static 는 이 객체를 사용하는 모두에게 이 값을 동일시 하겠다는 의미다.

    private static 클래스 instance = new 클래스(); // ② class 외부에서 값을 변경할 수 없도록 private 를 붙인다.


    //생성자   

    private 클래스 (){  // ① 외부에서 new 연산자로 생성자를 호출할 수 없도록 private 를 붙인다.
       
    }


    // 정적 메소드

    public static 클래스 getInstance(){ // ③ 외부에서 호출이 가능한 정적 메소드인 getInstance()를 정의한다.
        return instance; // ④ 정적 필드에서 참조하고 있는 자신의 객체를 리턴하도록 한다.
    }
   

}


- 여기서 클래스명 = Singleton 으로 가정한다.

- 생성자의 접근 제어자를 private로 하면, Class 외부에서 new 키워드를 사용할 수 없게 된다.

  즉, Singleton 클래스를 외부에서 호출할 수 없다.

  Singleton singeton = new Singleton(); // 에러 (외부에서 생성자에 접근할 수 없으므로 인스턴스 생성불가)

  클래스 내부에서는 인스턴스의 생성이 가능하다.

- 생성자의 접근 제어자를 public로 하면, Class 외부에서 new 키워드를 사용할 수 있게 된다.
  Singleton singleton1 = new Singleton();
  Singleton singleton2 = new Singleton();
  서로 다른 new 연산자로 인해서 객체가 생성이 되었기 때문에 서로 다른 메모리를 할당받게 된다.

- 외부에서 호출이 가능한 정적 메소드인 getInstance()를 정의한다.
  이때 정적 필드에서 생성한 인스턴스를 리턴값으로 돌려준다.
  Singleton singleton1 = Singleton.getInstance(); // 싱글톤 인스턴스 호출
  Singleton singleton2 = Singleton.getInstance(); // 싱글톤 인스턴스 호출
  if(singleton1 == singleton2){
      System.out.println("두 객체는 같습니다.");
  } else {
      System.out.println("두 객체는 다릅니다.");
  }

- 안드로이드 앱은 각 액티비티나 클래스 별로 주요 클래스들을 일일이 전달하기가 번거롭기 때문에 싱글톤 클래스를 만들어서 접근하도록 설계하는 것이 편하다.
  하지만 주의하자. stakoverflow 게시글 https://stackoverflow.com/questions/26882594/static-singleton-class-memory-leak-in-android 을 보면 99.9%는 안전하지만, If you call getInstance() from two different threads can happen that you instantiate Singleton twice.


'안드로이드 > Java 문법' 카테고리의 다른 글

자바 Arraylist  (0) 2019.05.26
Java BubbleSort  (0) 2019.05.13
[Java] instanceof 연산자  (0) 2017.10.24
Java static 변수 이해하기  (0) 2017.10.20
[Java] 정보은닉과 캡슐화  (0) 2017.10.16
블로그 이미지

Link2Me

,
728x90

자바 동영상 강좌를 들으면서 자바 개념을 학습중이다.

"intanceof 연산자가 이거다"라고 쏙 머리속에 들어오지 않지만 블로깅하고 요약해서 적어둔다.


instanceof 연산자
- 프로그램 실행시 참조 데이터형을 검사하기 위해 사용되는 연산자이다.
- 형변환이 가능한지 묻는 연산자이다.
- 형변환이 가능하면 true, 가능하지 않으면 false를 반환한다.

A instanceof B
- A : Object
- B : Class or Interface
- B가 클래스일 경우에는 A가 반드시 B 클래스와 상속관계에 있어야먄 유효하다.
  B 클래스 상속관계 : A가 B클래스의 객체이거나 하위 클래스의 객체
  A와 B가 상속관계가 없을 경우 캐스팅이 불가능하기에 컴파일 타임에 에러를 발생시킨다.
- B가 인터페이스일 경우에는 컴파일 에러는 발생하지 않는다. 런타임 에러가 발생한다.

if(animal instanceof Dog){
    System.out.println("멍멍이 짖는 소리");
} else if(animal instance of Duck){
    System.out.println("오리가 우는 소리");
}


stackoverflow 에 나온 Answer 예제

public class Animal{ float age; }
public class Lion extends Animal { int claws;}
public class Jungle {
    public static void main(String args[]) {

        Animal animal1 = new Animal(); // B클래스
        Animal animal2 = new Lion();  // B클래스의 하위 객체
        Lion lion1 = new Lion();
        Animal animal3 = new Animal();
        Lion lion2 = new Animal();   //won't compile

        if(animal1 instanceof Lion)   //false
        if(animal2 instanceof Lion)   //true
        if(lion1 insanceof Lion)      //true
        if(animal3 instanceof Animal) //true
    }
}



'안드로이드 > Java 문법' 카테고리의 다른 글

Java BubbleSort  (0) 2019.05.13
java Singleton Design Pattern  (0) 2018.09.24
Java static 변수 이해하기  (0) 2017.10.20
[Java] 정보은닉과 캡슐화  (0) 2017.10.16
자바 기본 데이터형과 크기  (0) 2017.10.11
블로그 이미지

Link2Me

,
728x90

static 변수에 대해 알아보자.


- 클래스의 변수나 메소드는 해당 클래스가 인스턴스화 되기 전에는 사용할 수 없다.

  하지만 static 변수나 메소드는 인스턴스의 생성과 상관없이(즉, 객체를 생성하지 않고도)

  바로 접근이 가능하고, 사용이 가능하다.

- public 으로 선언되면 누구나 어디서든 접근이 가능하다.

- JVM 은 실행과정에서 필요한 클래스의 정보를 메모리에 로딩한다.
  이 로딩(Loading) 시점에서 static 변수가 초기화된다.

- static 메소드는 해당하는 객체를 생성하지 않고도 해당 메소드를 호출하기 위한 것이다.


class AAA {
    static int num1 = 0;
    public AAA(){
        num1++;
        System.out.println("값="+ num1);
    }
}

class BBB {
    public static void main(String[] args){
        AAA aaa1 = new AAA();
        AAA aaa2 = new AAA();
        AAA aaa3 = new AAA();
    }


위 예제에서 static int num1 으로 선언된 변수는 Class AAA 에 종속될까? 안될까?

static 으로 선언된 변수는 Class AAA 에 포함되지 않는 변수다. 즉, 어떤 객체에도 포함되지 않으며 항상 값이 유지되도록 하는 변수이다.

그러므로 Class BBB에서 실행된 결과는 1, 2, 3 으로 증가된다.


값이 항상 고정적으로 이용해야 될 경우에는 final static 으로 선언해서 이용한다.

final static int MaxSpeed = 300; // 최대 스피드

final static int MinSpeed = 0; // 최저 스피드



Android 생명주기에서 onDestroy()가 호출되면 해당 Activity가 종료된다.

static 변수는 Android 생명주기와 상관없이, 해당 Process가 종료되어야 메모리에서 자유로워진다.

하지만, Android 에서는 어플의 Process를 가능한 한 유지하기 위해 노력하고 있다. 극단적인 메모리 부족현상이 발생하기 전에는 한번 실행된 어플의 Process 는 거의 죽지 않는다고 보면 된다.

View 처리를 하는 변수에 static을 잘못 사용하면 전혀 엉뚱한 결과나 오동작이될 수 있다는 것이 이해되는가?


Activity 생명주기(life cycle)와는 전혀 상관이 없고 Process가 종료되는 시점에 초기화된다.

Android 에서는 static 변수 사용은 정말 조심해야 한다는 걸 명심하자.


'안드로이드 > Java 문법' 카테고리의 다른 글

java Singleton Design Pattern  (0) 2018.09.24
[Java] instanceof 연산자  (0) 2017.10.24
[Java] 정보은닉과 캡슐화  (0) 2017.10.16
자바 기본 데이터형과 크기  (0) 2017.10.11
Java 클래스(Class) ★★★★★  (0) 2017.05.04
블로그 이미지

Link2Me

,
728x90

정보은닉(Information Hiding)
- 객체가 실행되는 과정이나 속성을 외부로부터 감추는 것.
  즉, 인스턴스 변수에 바로 접근 하지 못하도록 Private 선언을 해주는 것이다.
- private : Class 내부에서만 접근 가능
- public : 어디서든 접근 가능
- default : 접근제어 지시자를 선언하지 않은 경우로 동일 패키지 내에서는 접근 가능
- protected : 상속관계에 놓여 있어도 접근을 허용


캡슐화(encapsulation)
- 캡슐화는 메소드와 변수들을 클래스 하나로 묶어버리는 것
- 객체 외부에서는 개체 내부 정보를 직접 접근하거나 조작할 수 없고, 외부에서 접근할 수 있도록 정의된 오퍼레이션을 통해서만 관련 데이터에 접근할 수 있다.(getter, setter)
- 객체들 간의 메시지를 주고 받을 때 각 객체의 세부 내용은 알 필요가 없으므로 인터페이스가 간결해지고, 객체간의 결합도가 낮아진다.



Eclipse 에서 getter, setter 를 자동으로 생성하는 기능을 제공하고 있다.

public class Person1 {
    // 자바의 기본 원칙은 클래스 1개당 1개의 파일
    public String name; // 필드, 데이터 멤버
    public String number; //
} 

public 을 private 로 둘다 변경하고 나서,

Alt + Shlift + S + R를 누르면 팝업된 창이 나온다.

Alt + A 를 누르거나 마우스로 둘다 선택한 다음에

Generate 를 해주면 자동으로 생성된다.

public class Person1 {
    private String name; // 필드, 데이터 멤버
    private String number; 
   
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
}


'안드로이드 > Java 문법' 카테고리의 다른 글

[Java] instanceof 연산자  (0) 2017.10.24
Java static 변수 이해하기  (0) 2017.10.20
자바 기본 데이터형과 크기  (0) 2017.10.11
Java 클래스(Class) ★★★★★  (0) 2017.05.04
ArrayList and HashMap  (0) 2017.03.06
블로그 이미지

Link2Me

,
728x90

자바 기본 데이터형 크기에 대한 사항이다.

데이터형
예약어
비트수
범위
①논리형
boolean
8bit
(1바이트)
true, false
②문자형
char

16bit
유니코드
(2바이트)

수치로는 0 ~ 65535('\u0000'~'\uFFFF')

유니코드:영어,숫자-1바이트, 그외 다국어-2바이트

③수치형
(정수)
byte
8bit
(1바이트)
-128 ~ 127(-2의7제곱~2의7제곱-1)
개수:2의8제곱
④수치형
(정수)
short
16bit
(2바이트)
-32,768 ~ 32,767(-2의15제곱~2의15제곱-1)
개수:2의16제곱
⑤수치형
(정수)
int
32bit
(4바이트)
-2,147,483,648 ~ 2,147,483,647(-2의31제곱~2의31제곱-1)
개수:2의32제곱
⑥수치형
(정수)
long
64bit
(8바이트)
-9,223,372,036,854,775,808~9,223,372,036,854,775,807
(-2의63제곱~2의63제곱-1)
개수:2의64제곱
⑦수치형
(실수형)
float
32bit
(4바이트)
±3.40282347E+38, ±1.40239846E-45,
IEEE 754-1985표준
⑧수치형
(실수형)
double
64bit
(8바이트)
-1.79769313486231570E308~+1.79769313486231570E308

 



출처: http://aventure.tistory.com/59 [H.A.P.P.Y]

 

데이터형
예약어
비트수
범위
①논리형
boolean
8bit
(1바이트)
true, false
②문자형
char

16bit
유니코드
(2바이트)

수치로는 0 ~ 65535('\u0000'~'\uFFFF')

유니코드:영어,숫자-1바이트, 그외 다국어-2바이트

③수치형
(정수)
byte
8bit
(1바이트)
-128 ~ 127(-2의7제곱~2의7제곱-1)
개수:2의8제곱
④수치형
(정수)
short
16bit
(2바이트)
-32,768 ~ 32,767(-2의15제곱~2의15제곱-1)
개수:2의16제곱
⑤수치형
(정수)
int
32bit
(4바이트)
-2,147,483,648 ~ 2,147,483,647(-2의31제곱~2의31제곱-1)
개수:2의32제곱
⑥수치형
(정수)
long
64bit
(8바이트)
-9,223,372,036,854,775,808~9,223,372,036,854,775,807
(-2의63제곱~2의63제곱-1)
개수:2의64제곱
⑦수치형
(실수형)
float
32bit
(4바이트)
±3.40282347E+38, ±1.40239846E-45,
IEEE 754-1985표준
⑧수치형
(실수형)
double
64bit
(8바이트)
-1.79769313486231570E308~+1.79769313486231570E308

출처: http://aventure.tistory.com/59 [H.A.P.P.Y]

위 표에 대한 출처는 위 사이트고

아래 내용을 "난 Java를 공부한 적이 없다구요" 동영상 강좌 자료를 들으면서 기본 개념 잡는데 많은 도움이 될 거 같아서 안드로이드 개발 도움 관점으로 요약 정리하고 있다.

자바의 정석 책을 부분 부분 참조를 하다보니 이해를 못하고 넘어가는 경우가 많다. 결국 개발시간을 허비하는 결과로 이어지기 일쑤여서 기본기를 다지는 것이 중요하다는 느끼는데 막상 자바 혼자 공부하려면 쉽지 않더라.


자동형변환 규칙(Impict conversion)


명시적 형변환 :  자동형변환 발생시점 표시를 위해서, 규칙에 위배되지만 변환이 필요한 상황

- int num2 = (int) num1;

- logn num4 = (long) num3;

- 형 변환 나눗셈 예제 : (float)9/4; // 먼저 9가 형변환되어 9.0f 로 변경되고 4 가 4.0f로 변환되어 연산 수행

  . 피 연산자가 정수면 정수형 연산 수행

  . 피 연산자가 실수면 실수형 연산 수행, 단 % 연산제 제외.


비트 연산의 특징

- left shift 연산자 (<<) : 대상 필드의 값을 2진 비트로 바꾼 후에 왼쪽으로 특정 비트 수만큼 이동 시키고 빈자리는 0으로 채우는 연산자이다.
- right shift 연산자(>>) : 대상 필드의 값을 2진수로 바꾼 후 오른쪽으로 특정 비트 수만큼 이동시키고 빈자리는 양수일때 0, 음수일때는 1로 채우는 연산자이다.

- 왼쪽으로의 비트 열 이동은 2의 배수의 곱

  예) 2<<2  : 2 X 2의 제곱 = 2 X 4 = 8

       1<<5 :  1 X 2의 5제곱 = 1 X 32 = 32

- 오른쪽으로의 비트 열 이동은 2배 배수의 나눗셈

  예) 8 >> 1 ; 8 / 2 = 4 출력

       8 >> 2  ; 8 / 4 = 2 출력



'안드로이드 > Java 문법' 카테고리의 다른 글

Java static 변수 이해하기  (0) 2017.10.20
[Java] 정보은닉과 캡슐화  (0) 2017.10.16
Java 클래스(Class) ★★★★★  (0) 2017.05.04
ArrayList and HashMap  (0) 2017.03.06
Java foreach 문  (0) 2017.03.01
블로그 이미지

Link2Me

,
728x90

객체 지향 프로그래밍(Object-Oriented Programming: OPP)은 데이터와 절차를 하나의 덩어리(객체)로 묶어서 생각하는 방법이다.
객체 안의 변수를 필드(field)라 부르고, 객체 안의 함수를 메소드(method)라 부른다.
하나의 객체(Object)는 필드와 메소들 이루어진 소프트웨어의 묶음이다.

자바는 객체 지향 기법을 지원하지만 객체 지향을 사용한다고 해서 절차 지향 프로그램을 하지 않는다는 것이 아니다. 실제로 객체의 내부를 설계할 때는 절차 지향 프로그래밍을 사용한다.


절차지향 언어의 특징

- 절차 지향 프로그래밍이란, 프로그래밍을 순서, 즉 절차에 따라 프로그래밍하는 것을 의미한다.

- 절차 지향의 대표적인 프로그램은 C언어이다.


객체지향 언어의 특징

- 사람(주체)가 바라본 대상(사람, 사물, 객체 등)을 객체(object)라고 한다.

- 객체지향 언어는 사람이 일상적으로 보고, 느끼고, 생각하는 관점에서 프로그래밍을 하는 것이다.

- 객체 지향 프로그램의 첫번째 단계는 객체의 추출이다.

  객체는 각각 속성과 기능들을 가진다.


Class (클래스)

- 클래스는 설계서(붕어빵틀)다. 즉, 실체가 아니라 타입이다.

- Java의 모든 클래스는 Object 클래스를 상속한다.

- new 명령으로 해당 클래스 타입의 객체를 생성한 후, 그 객체에 데이터를 저장하고, 그 객체의 멤버 메소드를 실행하는 것이다.

  Contacts phonebook; // 클래스 타입 변수 선언

  phonebook = new Contacts(); // 전화번호부 실제 객체 생성 (변수 = new 클래스명();)

  인스턴스 변수는 반드시 객체를 생성해야만 호출이 가능하다.

  참조 변수 지정과 객체 생성을 한번에 할 수 있다.

  Contacts phonebook = new Contacts(); // 전화번호부 객체 생성, Class 타입 변수명 = new 생성자 ();

  phonebook .number = "010-0000-0000"; // Class 인스턴스를 생성한 다음 참조변수 phonebook 을 통해야 한다.

  참조변수의 특징은 메모리에 생성되어 있는 인스턴스의 위치값을 지정한다.

- final 메소드는 Class 상속되는 것은 허용하되, 메소드의 오버라이딩은 허용하지 않겠다는 의미다.


메서드(함수)가 호출되면 수행에 필요한 만큼의 메모리 스택에 할당을 받는다.

메서드(함수)가 수행을 마치고 나면 사용했던 메모리를 반환하고 스택에서 제거된다.


같은 Class 에 속한 멤버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출이 가능하다.

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

인스턴스 메서드(함수)는 인스턴스 메서드와 클래스 메서드 모두 인스턴스 생성없이 바로 호출이 가능하다.

클래스 변수가 인스턴스 변수를 참조, 호출하기 위해서는 반드시 객체를 생성해야 한다.


참조형 변수는 메모리에 생성되어 있는 인스턴스의 위치값을 저장한다.


 Premitive Type 변수

 - byte, short, int, long, float, double, char, boolean 8가지 타입을 제공한다.

 - type 마다 size가 fix 되어 있다.
 - 기본값이 있으므로 null이 존재하지 않는다.
 - generic을 이용할 때 필요한 wraper class가 존재한다. (Integer, Long..)
 - 컴파일 시, 크기를 초과하면 에러가 발생한다.

 Reference Type 변수

 - 기본형을 제외한 모든 타입은 Reference Type 이며 java.lang.Object 를 상속 받는다.

 - 참조형에는 Class Type, Interface Type, Array Type이 있다.

 - 기본값은 아무런 참조 정보가 없으므로 null을 리턴한다.

 - 생성된 객체는 Heap Memory 에 저장된다.

 primitive type의 == 연산은 값을 비교한다.
 reference type의 == 연산은 주소를 비교한다.
 리터럴 방식을 통해 만든 변수와, new를 통해 저장되는 메모리가 다르다.
 두 변수의 참조 메모리가 서로 다르다는 뜻이다.
 reference 타입에서 설명한 대로 new로 만든 객체는 Heap 영역에 저장이 되고,
 리터럴 방식으로 만들어진 객체는 String Constant Pool영역에 저장되기 때문이다.

 primitive Type은 value를 전달한다.
 reference Type은 reference를 전달한다.


 String은 reference Type 으로 다른 reference Type과 다른점은 JVM에서 String constant pool을 이용해 메모리 관리를 한다.

 - if(str == input) {} // str 이 String 변수이면 == 로 비교할 수 없다.

 - if(str.equals(input)) 으로 비교해야 한다.

 변수는 사용하기 전에 선언되어야 한다. 변수의 선언이란 "이름"과 "타입"을 정해주는 것이다.

 Java 에서 변수의 선언은 Class 내에 선언한다.

 main 함수는 C언어에서는 1개만 존재하지만, Java 에서는 Class 파일마다 존재해도 된다.

 - 메서드 내부에 선언된 변수는 그 메서드 내부에서만 사용 가능하다.

 - 메서드 외부(클래스 내부)에 선언된 변수는 클래스 내에서 사용 가능하다.



생성자(Constructor)는 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드다.

- 생성자의 이름은 클래스 이름과 같아야 한다.

- 생성자는 리턴값이 없다.

- 생성자는 매개변수가 없는 것도 있고, 있는 것도 있다.

- 클래스가 객체 생성될 때 맨 처음 호출되는 것이다.

- 모든 클래스는 반드시 하나 이상의 생성자가 정의되어 있어야 한다.

  만약, 생성자가 하나도 정의되어 있지 않는 경우,

  컴파일러는 자동으로 매개변수가 없는(no-parameter) 기본 생성자를 추가하여 컴파일 한다.

- 사용자가 생성자를 구현해주면 no-parameter 생성자는 자동으로 추가되지 않는다.

  생성자를 직접 만들어 줄 경우에는 no-parameter 생성자를 함께 만들어주는 것을 습관화하는 것이 좋다.

- 모든 서브 클래스의 생성자는 먼저 수퍼 클래스의 생성자를 호출한다.

  1. super(매개변수)를 통해 명시적으로 호출을 해준다.

  2. super(매개변수)를 명시적으로 지정하지 않으면 자동으로 no-parameter 생성자가 호출된다.


※ 흔한 오류

    수퍼클래스에 no-parameter 생성자가 없는데, 서브 클래스의 생성자에서 super() 호출을 안해주는 경우


super
- 자신을 가리키는 키워드가 this 라면, 부모를 가리키는 키워드는 super
- super() 는 부모의 생성자를 의미한다.
- 부모의 생성자를 임의로 호출하지 않으면, 부모 class의 기본(no-parameter) 생성자가 자동으로 호출된다.
- 명시적으로 호출하지 않으면 super()를 컴파일 시 자동으로 추가된다.

public class Contacts {
    public Contacts(){  // default 생성자 = no-parameter 생성자     

       // 클래스 인스턴스를 메모리에 생성한다.

       // 주로 인스턴스 변수를 초기화한다.

    }   
}


Contacts pbook = new Contacts(); // default  생성자 호출

default 생성자 호출시 default 생성자가 안 만들어져 있으면 오류가 발생한다.



public class Value {

   // Java에서는 클래스 외부에는 변수를 선언할 수 없다.

    public static final String IPADDRESS = "http://10.100.100.2";  // 서버의 IP주소

    String number;

}


getDbData(Value.IPADDRESS + "/get_json.php");


- 클래스 정적(static) 변수는 객체 생성없이 직접 사용이 가능하다.

- 클래스이름.메서드이름(Value.IPADDRESS) 과 같은 식으로 호출이 가능하다.

- 클래스 정적 변수는 모든 인스턴스가 하나의 저장공간을 가지므로 항상 공통된 값을 갖는다.

  모든 인스턴스에 공통된 값을 유지해야 하는 경우에 static을 붙인다.

  프로그램 실행시 static 지정자가 붙은 멤버들은 단 한번의 실행으로 메모리에 생성된다.

  프로그램 종료 시 메모리에서 소멸된다.


접근 제한자

접근 제한자는 Class 의 멤버에 대해 다른 Class 에서 접근하는 것을 제한하는 용도로 사용된다.

- public : 모든 Class 에서 접근 가능

- protected : 같은 패키지에 있는 Class, 그리고 다른 패키지의 자손 클래스에서 접근이 가능

- default : 같은 패키지에 있는 Class 들만 접근 가능

  String name; // 아무런 접근 지정자도 지정되지 않았으므로 default 접근 지정자다.

- private : 같은 Class 내에서만 접근 가능


지시자

클래스 내부

동일 패키지

상속받은 클래스

이외의 영역

 private


 X

X

X

 default


X

X

 protected


X

 public



- 클래스의 멤버 변수에 접근할 때에는 기본적으로 getter/setter 메서드를 사용하여 간접 접근을 해야 한다.


클래스 상속(inheritance)

public class SearchActivity extends Activity {
}

public class MainActivity extends AppCompatActivity {

       // ....

}

public class Child extends Parent {
}

- 상속이란 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.

- 상속을 받는다는 것은 조상 클래스(Activity)를 확장(extends)한다는 의미로 해석할 수 있다.

  상속은 강한 연결고리를 형성한다.

  복합관계는 강한 연결고리를 형성하지 않는다.

- 자바는 단일 상속만 허용하고 다중 상속은 허용하지 않는다.

  C++ 에서는 여러 클래스로부터 상속받는 다중상속을 허용한다.

  public class Child extends Parent1, Parent2 { // 이와 같은 표현은 허용하지 않는다.

  }

- 모든 상속 계층의 최상위에는 Object 클래스가 위치한다.

- 생성자와 초기화 블럭은  상속되지 않는다. 멤버만 상속된다.

- 클래스 속성과 기능들을 다른 클래스에서 재사용할 수 있다.

- 중복 코드를 제거하면 가독성이 높아지고 개발 시간을 단축할 수 있다.

- 각 클래스의 공통점을 가진 클래스를 부모 클래스로 만든다.


추상(abstract) 클래스

- 미완성 설계도

- 추상 클래스로 인스턴스는 생성할 수 없다.

  추상 클래스는 상속을 통해서 자손 클래스에 의해서만 완성할 수 있다.

- 추상 클래스는 abstract 를 붙이기만 하면 된다.



오버라이딩(overriding)

조상(상위) 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.

- 상위 클래스에 정의된 이름, 반환형, 매개변수 선언까지 완전히 동일한 메소드를 하위 클래스에서 다시 정의하는 것이다.

- 하위 클래스에 정의된 메소드에 의해 상위 클래스의 메소드는 가리워진다.

overriding 의 조건

- 이름이 같아야 한다.

- 매개변수가 같아야 한다.

- 리턴타입이 같아야 한다.

- static, final, private 가 지정된 메소드는 오바라이딩 불가

  super.toString(); 처럼 부모 클래스 메소드를 호출하거나, private 를 protected 로 변수명을 변경하면 상속이 가능하다.



다형성(Polymorphism)

- 수퍼클래스 타입의 참조변수가 서브클래스 타입의 객체를 참조할 수 있다.

   Computer test = new Notebook();



method overloading

같은 클래스 내에서 변수와 마찬가지로 메소드도 서로 구별할 수 있어야 한다.

하지만 자바에서는 같은 클래스 내에서 아래와 같은 조건이면 동일 이름을 가진 메소드를 정의할 수 있다.

1. 메소드 이름이 같아야 한다.

2. 메소드이 매개변수의 개수 또는 매개변수의 타입이 달라야 한다.

3. 매개변수는 같고 리턴타입이 다른 것은 오버로딩이 성립되지 않는다.

오버로딩의 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.
    (리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)

 



출처: https://java.ihoney.pe.kr/99 [허니몬(Honeymon)의 자바guru]

오버로딩의 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.
    (리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)

 



출처: https://java.ihoney.pe.kr/99 [허니몬(Honeymon)의 자바guru]


오버로딩의 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.
    (리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)


출처: https://java.ihoney.pe.kr/99 [허니몬(Honeymon)의 자바guru]


패키지(package)

package com.tistory.link2me.addresschart;


- 패키지란, 클래스의 묶음이다.

- 하나의 소스파일에는 최상단에 단 한번의 패키지 선언을 허용한다.

- 패키지명은 선언시 반드시 소문자로 선언해야 한다.

- 모든 클래스는 반드시 하나의 패키지에 속해야 한다.

- 패키지는 점(.)을 구분자로 하여 계층 구조로 구성할 수 있다.

- 패키지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리이다.


import 문

import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;


- 다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스 이름을 사용해야 한다.

- 하지만, 클래스의 코드를 작성하기 전에 import 문으로 사용하고자 하는 클래스의 패키지를

  미리 명시해 주면 소스코드에 사용되는 클래스 이름에서 패키지명을 생략할 수 있다.


'안드로이드 > Java 문법' 카테고리의 다른 글

[Java] 정보은닉과 캡슐화  (0) 2017.10.16
자바 기본 데이터형과 크기  (0) 2017.10.11
ArrayList and HashMap  (0) 2017.03.06
Java foreach 문  (0) 2017.03.01
자바 배열과 기본 문법  (0) 2016.07.11
블로그 이미지

Link2Me

,
728x90

ArrayList
- 배열 기반, 데이터의 추가와 삭제 유용하지 못함, 순차적인 추가 삭제는 제일 빠름, 인덱스가 있어 임의의 요소에 대한 접근성이 뛰어남.
- 대량의 자료를 추가/삭제하는 경우에 내부적인 처리량이 늘어나서 상당한 성능저하를 가져온다.
- 각 데이터의 인덱스를 가지고 있기 때문에, 필요한 데이터의 접근이 한번만에 가능하다.
  많은 데이터를 한 번에 다 가져와서 여러번 참조해 쓸 때 최상의 성능을 나타낸다.
- 레퍼런스 타입의 데이터만 저장할 수 있다.
- 데이터 내용의 중복이 가능하다. null값을 허용한다.

ArrayList<String> list = new ArrayList<String>();
list.add("apple")'; // 추가
String str = list.get(2); // 데이터 가져오기
list.remove(1); // 데이터 삭제
list.set(0, "오렌지"); // 데이터 수정
int index = list.indexOf("apple"); // 인덱스 알아내기


ArrayList<Calendar_Item> list = new ArrayList<Calendar_Item>();

와 같이 String 대신에 Calendar_Item 이 오면 데이터 수정을 어떻게 해야 할까?

Calendar_Item item = new Calendar_Item();
item.setYear(year);
item.setMonth(month);
item.setDay(day);
item.setWeekday(weekday);
item.setColor(color);
item.setName(name);

item.setKey(key);

list.set(0,item);

즉, String 값 대신에 Calendar_Item item 값을 넣어주면 된다.

초보자로서 이렇게 생각하는 것이 참 어렵다.


검색으로 index 값인 0 를 찾아내는 로직이 구조상 속도가 빠르지 않는거 같다.

public int getIndexOfList(String search_key) {
    for (int temp = 0; temp < list.size(); temp++) {
        String key = list.get(temp).getKey();
        if (key != null && key.equals(search_key)) {
            return temp;
        }
    }
    return -1;
}

하나의 index 값을 찾아내는데 ArrayList 배열 전체를 순환하면서 일치하는 걸 찾아낸다.

검색으로 찾아야 할 데이터가 많다면 속도 저하는 당연히 발생할 것이다.



컬렉션 프레임웍에서는 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화하였다.

컬렉션에 저장된 각 요소에 접근하는 기능을 가진 Iterator 인터페이스를 정의하고, Collection 인터페이스에는 Iterator를 반환하는 iterator()를 정의하고 있다.

List list = new ArrayList();
Iterator it = list.iterator();
while(it.hasNext()){
    System.out.println(it.next());
}



HashMap

- Map 인터페이스의 한 종류로, key와 value 를 묶어 하나의 entry 로 저장한다는 특징을 갖는다.

- key는 중복을 허용하지 않고, value는 중복 허용한다.

  동일한 key 가 입력되면, 나중에 입력된 데이터(key, value)로 덮어 씌워진다.

- Map에 종류에는 Hashtable, HashMap, LinkedHashMap, SortedMap, TreeMap 등이 있다.

- 배열과 연결이 결합된 형태, 추가, 삭제, 검색, 접근성이 모두 뛰어남, 검색에는 최고 성능을 보인다.
HashMap<키의타입, 데이터의 타입> 해쉬테이블 이름 = new HashMap<키의 타입, 데이터의 타입>();
- 해쉬 테이블에 저장할 데이터 타입과, 키 타입 두 가지 데이터 타입을 정해야 한다.
- HashMap<String, Integer> hashtable = new hashmap<String, Integer>();
- hashtable.put("apple", new Integer(100)); // 해쉬 테이블에 데이터 저장
- Integer num = hashtable.get("apple"); // 해쉬테이블에 저장된 데이터를 읽어온다.
- hashtable.remove("apple"); // 해쉬테이블에 있는 데이터 삭제

※ 멀티쓰레드에서는 HashTable을 쓴다


* Map 인터페이스의 주요 메소드


HashMap 메소드 

설명 

put() 

- 키(Key)와 값으로 구성된 새로운 데이터를 추가한다. 

get() 

- 지정한 키(Key)에 해당하는 데이터를 반환한다. 

remove() 

- 지정한 키(Key)에 해당하는 데이터를 삭제한다. 

containKey() 

- 지정한 키(Key)가 존재하는지 여부를 반환한다. 

containsValue() 

- 지정한 값이 존재하는지 여부를 반환한다. 

size() 

- Map의 요소 개수를 반환한다. 

isEmpty() 

- Map이 비어 있는지의 여부를 반환한다. 



*



출처: http://hyeonstorage.tistory.com/230 [개발이 하고 싶어요]

* Map 인터페이스의 주요 메소드


HashMap 메소드 

설명 

put() 

- 키(Key)와 값으로 구성된 새로운 데이터를 추가한다. 

get() 

- 지정한 키(Key)에 해당하는 데이터를 반환한다. 

remove() 

- 지정한 키(Key)에 해당하는 데이터를 삭제한다. 

containKey() 

- 지정한 키(Key)가 존재하는지 여부를 반환한다. 

containsValue() 

- 지정한 값이 존재하는지 여부를 반환한다. 

size() 

- Map의 요소 개수를 반환한다. 

isEmpty() 

- Map이 비어 있는지의 여부를 반환한다. 



*



출처: http://hyeonstorage.tistory.com/230 [개발이 하고 싶어요]

* Map 인터페이스의 주요 메소드


HashMap 메소드 

설명 

put() 

- 키(Key)와 값으로 구성된 새로운 데이터를 추가한다. 

get() 

- 지정한 키(Key)에 해당하는 데이터를 반환한다. 

remove() 

- 지정한 키(Key)에 해당하는 데이터를 삭제한다. 

containKey() 

- 지정한 키(Key)가 존재하는지 여부를 반환한다. 

containsValue() 

- 지정한 값이 존재하는지 여부를 반환한다. 

size() 

- Map의 요소 개수를 반환한다. 

isEmpty() 

- Map이 비어 있는지의 여부를 반환한다. 




출처: http://hyeonstorage.tistory.com/230 [개발이 하고 싶어요]

* Map 인터페이스의 주요 메소드

HashMap 메소드 

설명 

put(Object Key, Object Value)

 - 키(Key)와 값으로 구성된 새로운 데이터를 추가한다. 

get(Object Key)

 - 지정한 키(Key)에 해당하는 데이터를 반환한다. 

remove(Object Key)

 - 지정한 키(Key)에 해당하는 데이터를 삭제한다. 

boolean containsKey(Object Key)

출처: http://vaert.tistory.com/107 [Vaert Street]

boolean containsKey(Object Key)

 - 지정한 키(Key)가 존재하는지 여부를 반환한다. 

boolean containsValue(Object Value)

 - 지정한 값이 존재하는지 여부를 반환한다. 

clear()

 - HashMap에 저장된 모든 객체를 제거한다

Object clone()

 - 현재 HashMap을 복제하여 반환한다.
    newmap = (HashMap)map.clone();

newmap = (HashMap)map.clone();

출처: http://vaert.tistory.com/107 [Vaert Street]

int size() 

 - HashMap에 저장된 요소의 개수를 반환한다. 

isEmpty() 

 - Map이 비어 있는지의 여부를 반환한다. 

Collection values()

 - HashMap에 저장된 모든 값을 컬렉션 형태로 반환한다.


HashTable과 HashMap의 차이는 null 값을 허용하는데에 있다.
HashTable은 null 값을 허용하지 않지만, HashMap은 null 값을 허용한다.

HashMap의 경우 동기화를 지원하지 않지만 Hashtable은 동기화를 지원하여 다중 스레드 환경에서 사용하면 된다.
보통은 HashMap을 활용하고 동기화가 필요한 시점에서는 Java 5부터 제공하는 ConcurrentHashMap을 사용하는 것이 더 좋은 방법이라 표현한다.
HashMap은 저장된 요소들의 순회를 위해 Fail-Fast Iterator를 반환한다.
Hashtable은 같은 경우 Enumeration을 반환한다.


there are many differences between HashMap and Hashtable classes that are given below.

HashMapHashtable

1) HashMap is non synchronized. It is not-thread safe and can't be shared between many threads without proper synchronization code.

Hashtable is synchronized. It is thread-safe and can be shared with many threads.

2) HashMap allows one null key and multiple null values.

Hashtable doesn't allow any null key or value.

3) HashMap is a new class introduced in JDK 1.2.

Hashtable is a legacy class.

4) HashMap is fast.

Hashtable is slow.

5) We can make the HashMap as synchronized by calling this code
Map m = Collections.synchronizedMap(hashMap);

Hashtable is internally synchronized and can't be unsynchronized.

6) HashMap is traversed by Iterator.

Hashtable is traversed by Enumerator and Iterator.

7) Iterator in HashMap is fail-fast.

Enumerator in Hashtable is not fail-fast.

8) HashMap inherits AbstractMap class.

Hashtable inherits Dictionary class.



ArrayList 다음에 <T>,<String>,<Integer>,<Class명> 라고 쓰여진 형식을 많이 보았을 것이다.

이 <>를 제네릭(Generics)이라 하는데, 이 <>안에 어떠한 타입을 선언해주어 해당 ArrayList, List 등이 사용할 객체의 타입을 지정해준다는 뜻이다. 이는 다룰 객체의 타입을 미리 명시하여 객체의 형변환을 사용할 필요없게 하며, 내가 사용하고 싶은 데이터 타입만 사용할 수 있게 해주는 효과가 있다.


ArrayList 의 제네릭스로 HashMap<String,String> 을 사용한 예제다.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;

public class ArrayList_EX01 {

    public static void main(String[] args) {
        ArrayList <HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
        HashMap<String, String> map = new HashMap<String,String>();
        map.put("1", "고양이");
        map.put("3", "송아지");
        map.put("2", "강아지");
        //key, value로 String의 값들을 넣어준다.
        list.add(map);

        for(int i = 0; i < list.size(); i++){
            // ArrayList 사이즈 만큼 for문을 실행한다.
            System.out.println("list 순서 " + i + "번쨰");
            for( Entry<String, String> elem : list.get(i).entrySet() ){
                // list 각각 HashMap받아서 출력한다.
                System.out.println( String.format("키 : %s, 값 : %s", elem.getKey(), elem.getValue()) );
            }
        }

    }
}


'안드로이드 > Java 문법' 카테고리의 다른 글

[Java] 정보은닉과 캡슐화  (0) 2017.10.16
자바 기본 데이터형과 크기  (0) 2017.10.11
Java 클래스(Class) ★★★★★  (0) 2017.05.04
Java foreach 문  (0) 2017.03.01
자바 배열과 기본 문법  (0) 2016.07.11
블로그 이미지

Link2Me

,
728x90

C#에서 사용하는 foreach 문과 동일한 형태의 Java for 문을 적어둔다.


C#

 public List<Address_Item> SelectCreature(String Name)
{
    List<
Address_Item> foundCreature = new List<Address_Item>();

    //For the customer name that equals what has been searched...
    foreach (
Address_Item c in m_creature)
    {
        if (c.CreatureName.Equals(Name, StringComparison.OrdinalIgnoreCase))
            foundCreature.Add(c);
    }

    return foundCreature;
}

 foreach 루프를 사용하면 IEnumerable 인터페이스를 지원하는 배열 같은 컨테이너 클래스의 각 항목을 반복할 수 있다.

 Java

 public List<Address_Item> SelectCreature(String Name)
{
    // List is an interface, you must use a specific implementation
    // like ArrayList:
    List<
Address_Item> foundCreature = new ArrayList<Address_Item>();

    //For the customer name that equals what has been searched...
    for ( Address_Item c : m_creature)
    {
        if (c.CreatureName.equalsIgnoreCase(Name))
            foundCreature.add(c);
    }

    return foundCreature;
}


C# 에서는 foreach 문으로 표기를 하는데 Java 에서는 for 문으로 표기하고 괄호안의 내용만 foreach 문 형태로 되어 있다.


String array[] = { "윤아", "수영", "윤시윤", "전소민", "정소민" };

for(int i=0; i<array.size(); i++){   // 조건식에 array.size()를 사용하면 for문을 돌 때마다 size 를 호출한다.
    System.out.println(array.get(i));
}

for(int i=0,size = array.size(); i<size; i++){  // for문을 돌 때마다 size를 호출하는 걸 방지목적
    System.out.println(array.get(i));
}

foreach 문
// 배열의 일부가 아닌, 배열의 전체를 참조할 필요가 있을 경우에 유용하게 사용
// 배열의 값을 수정할 수는 없다.
// JDK 5.0 버전부터는 향상된 for문을 지원한다.
// for(변수타입 변수이름 : 배열이름)
for(String s : array){
    System.out.println(s);
}

'안드로이드 > Java 문법' 카테고리의 다른 글

[Java] 정보은닉과 캡슐화  (0) 2017.10.16
자바 기본 데이터형과 크기  (0) 2017.10.11
Java 클래스(Class) ★★★★★  (0) 2017.05.04
ArrayList and HashMap  (0) 2017.03.06
자바 배열과 기본 문법  (0) 2016.07.11
블로그 이미지

Link2Me

,
728x90

안드로이드 앱 프로그래밍 책과 인터넷 검색을 통해서 안드로이드 앱 프로그램을 만드는 연습을 하다보니 한계에 부딪치기 시작했다.

인터넷에 올라온 소스코드를 가지고 테스트를 해보니 전화번호부 가져오기를 하다보니 원하지 않게 값이 저장된다. 거의 유사한 코드들이 복사해서 돌아다니고 있다.

그래서 자바 책을 들여다보면서 기본적인 사항을 내 나름대로 조금씩 정리를 해둔다.

처음부터 문법만 접하면 어떻게 활용해야 하는지를 몰라서 성취감이 없다.

목표를 정하고 만들어야겠다는 걸 하기 위해 기능을 하나씩 익히고 부족하면 문법사항을 들여다보면서 배우는게 초보자인 나에게는 효율적이다.

부족하지만 그동안 작성해두었던 게시물 중심으로 샘플을 활용하여 작성해둔다.


주석문

// 한줄 주석


/*

여러줄 주석

*/ 


/**

 document 생성용 주석

*/



변수(Variable) : 프로그램이 실행되는 동안 데이터를 저장하기 위한 공간

- 메모리 공간 할당 + 메모리 공간의 이름

- int 와 같이 변수의 특성을 결정짓는 키워드를 가리켜 자료형이라 한다.

- 변수 이름의 제약 사항

  . 숫자로 시작 불가

  . $와_ 이외의 다른 특수문자는 사용불가

  . 키워드는 변수의 이름으로 사용 불가

- short 형 데이터는 int형 데이터로 자동 변환한다.

- 자바에서는 true 와 false는 그 자체로 저장이 가능한 데이터이다.

- 1과 '1'은 서로 다르다.

지역변수

 - Local Variable(지역변수)는 메서드 안에 선언된 변수를 말한다.

 - 사용자가 직접 초기화를 해주어야 한다. 초기화를 안하면 에러가 발생한다.

 - 지역변수 생성 시점은 해당 메서드가 수행될 때이다.

 - 메서드 수행이 끝나면 지역변수는 메모리에서 사라진다.

 멤버변수

 - Member Variable(멤버변수)는 클래스 안에 선언된 변수를 말한다.

 - 사용자가 초기화를 하지 않아도 시스템에 의해서 자동으로 초기화된다.

   하지만 프로그램의 정확성을 위해 직접 초기화하는 습관이 필요하다.

 - 멤버변수는 static 으로 선언된 변수와 인스턴스 변수가 있다.

 - static 변수는 객체를 생성하지 않고, 클래스 이름으로 참조할 수 있다.

 - 인스턴스 변수는 반드시 객체를 생성한 후 객체 레퍼런스를 통해서 참조해야 한다.



안드로이드앱 프로그래밍 동영상 강좌를 듣다보면 casting 이란 말이 엄청 나온다.

casting(형변환)은 변수 또는 리터럴의 타입을 다른 타입으로 변환하는 것을 말한다.

int score = (int) 88.3; // double 형의 값을 int 형으로 변환하여 88을 저장한다.


배열은 PHP 에서도 정말 많이 활용된다. C#에서도 배열의 필요성을 많이 알게되었다.

소스코드를 접하면서 내가 소홀하게 무심코 넘겼던 것을 알게되었고, 배열의 사용이 정말 중요하고 많더라.


배열(array)을 선언한 다음에는 배열을 생성해야 한다.

- 배열 선언 : 참조변수를 위한 공간 만들기

  int [] grades;

- 배열 생성 : new 키워드를 이용하여 배열을 생성한다. 데이터를 저장할 수 있는 공간이 만들어진다.

  grades = new int[5];

- 배열은 같은 타입의 데이터만 여러개 생성한다.

- 배열의 길이는 length 속성을 이용하면 알 수 있다.

- 배열의 크기를 키보드 입력 값을 받아서 지정할 수 있다.

  int n = 10;

  int [] grades = new int[n];

- 배열에서 최대값, 최소값을 구할 때 int max = 0; 이라는 초기값을 지정하는 것은 오류가 발생할 수 있다.

  최대값이 음수일 수도 있는데, 초기값을 0 으로 선언하면, 0보다 작으므로 원하지 않는 결과가 나온다.


배열의 복사

배열에서 조건에 맞는 데이터만 복사하고 싶은 경우가 있다.

이때 for 문으로 돌리면서 if 조건문으로 해당되는 데이터만 복사하면 된다.


배열의 단점

ㅇ 크기를 변경할 수 없다.

    - 크기를 변경할 수 없으므로 새로운 배열을 생성해서 데이터를 복사하는 작업이 필요하다.

    - 실행속도를 향상시키기 위해서는 충분히 큰 크기의 배열을 생성해야 하므로 메모리가 낭비된다.

ㅇ 비순차적 데이터의 추가 또는 삭제에 시간이 많이 걸린다.

    - 차례대로 데이터를 추가하고 마지막에서부터 데이터를 삭제하는 것은 빠르지만,

    - 배열의 중간에 데이터를 추가하려면, 빈자리를 만들기 위해 다른 데이터들을 복사해서 이동해야 한다.


equals()는 두 배열에 저장된 모든 요소를 비교해서 같으면 true, 다르면 false를 반환한다.

equals()는 일차원 배열에서만 사용 가능하다.

다차원 배열 비교는 deepEquals()를 사용해야 한다.



메서드 : 코드 블럭에 이름을 붙여 놓은 것을 말한다.

- return type : 메서드는 블록 안의 코드를 실행한 다음 결과를 반환할 수 있다.

- return 값이 필요없는 경우는 void 라고 적는다.

- 반환한 값이 있다면 데이터의 유형에 따라 byte, short, int, long, float, double, char, boolean, 배열, 클래스 이름을 적는다.

- 매개변수 : 외부로부터 값을 전달받는데 사용된다.

- 메서드를 작성하는 가장 큰 이유는 반복적으로 사용하는 코드를 줄이기 위함이다.

- 하나의 메서드는 한가지 기능만 수행하도록 작성하는 것이 좋다.


Java에서 매개변수 전달방식은 call-by-value 이다.
Java 에서 문자열 비교는 compareTo
if(names[j].compareTo(names[j+1]) > 0){ }


method overloading : 한 클래스 내에 같은 이름의 메서드(함수)를 여러개 정의하는 것을 말한다.

- 메서드 이름이 같아야 한다.

- 매개변수의 개수 또는 타입이 달라야 한다.

- 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.


public class Contacts {
    public void ContactsIDInsert(ContentResolver cr, Context context, String strName, String strMobileNO) {
        //코드 작성
    }

    public void ContactsIDInsert(ContentResolver cr, Context context, String strName, String strMobileNO, String strOfficeNO) {
        //코드 작성
    }

    public void ContactsIDInsert(ContentResolver cr, Context context, String strName, String strMobileNO, String strOfficeNO, String strEmail, String strPhoto) {
        //코드 작성
    }

}


오버라이딩(overriding)

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.

overriding 의 조건

- 이름이 같아야 한다.

- 매개변수가 같아야 한다.

- 리턴타입이 같아야 한다.

- static, final, private 가 지정된 메소드는 오바라이딩 불가


try catch finally 문

try {

   예외 발생 가능성이 있는 문장들;

}
catch (예외타입 메개변수명){

   예외타입의 예외가 발생할 경우 처리 문장;

}
finally {

   항상 수행할 필요가 있는 문장들;

   // 필수 블록은 아니다

}

그냥 무조건 항상 실행되는 것이 아니라 finally 와 연결되어있는 try 블록으로 일단 진입을 하면,
무조건 실행되는 영역이 바로 finally 블록이다.
중간에 return 문을 실행하더라도 finally 블록이 실행된 다음에 메소드를 빠져나간다.


'안드로이드 > Java 문법' 카테고리의 다른 글

[Java] 정보은닉과 캡슐화  (0) 2017.10.16
자바 기본 데이터형과 크기  (0) 2017.10.11
Java 클래스(Class) ★★★★★  (0) 2017.05.04
ArrayList and HashMap  (0) 2017.03.06
Java foreach 문  (0) 2017.03.01
블로그 이미지

Link2Me

,