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";
}
}
|
728x90
'안드로이드 > 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 |