'자바 클래스 개념 이해'에 해당되는 글 1건

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

,