PC

블로그 이미지

DAVID

'Programming'에 해당되는 글 109건

제목 날짜
  • 160324: 9회차2 2016.03.24
  • 160323: 8회차1 2016.03.23
  • 160322: 7회차4 2016.03.22
  • 160321: 6회차1 2016.03.21
  • 160318: 5일차2 2016.03.18
  • 160317: 4회차3 2016.03.17
  • 160316: 3회차2 2016.03.16
  • 160315: 2회차1 2016.03.15
  • 160314: 1회차1 2016.03.14

160324: 9회차

Programming 2016. 3. 24. 13:20

종료하기 전 티스토리 네이버 구글 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것

[16]부터 시작!

생성자는 new 할 때 호출됨 :)!


자식 클래스 객체 생성시 - 부모 클래스의 생성자가 먼저 호출! -> 그담에 자식 생성자 호출!

메모리상에 부모 - 자식 만들어지니까


클래스의 기본 생성자 안에는 부모의 기본 생성자를 호출하는 코드가 숨겨져있음.

super(); <- 이거!


package day09;


class TV{

}


class Movie extends TV{

String part = "한국 영화";

}


class Action extends Movie{

String name = "";

}


public class MovieTest_1 {

public static void main(String args[]){

Action act = new Action();

/*

* 요기서 생성자를 호출하는데

* Action()이 없으니까 기본 생성자 

* 자동 호출

* 

* 근데 사실은 Action(){}은

* Action(){

* super();//부모의 기본생성자 호출!

* }

* 가 숨겨져 있는 거임

* 

* 그러면 Movie(){} 안에는

* Movie(){

* super();

* } 가 숨겨져있는거임

* 

* 그러면 또 TV(){} 안에는

* TV(){

* super();

* } 가 숨겨져 있음

* 

* 

* */

act.name = "마파도";

System.out.println(act.name);

}

}


그러니까 생성자는
자식1 호출 -> 부모1(자식1부모) 호출 -> 부모2(부모1부모) 호출
부모2 실행 -> 부모1 실행 -> 자식1 실행
순서로 감

package day09;

class A{
A(){
super();//얘는 부모(Object)의 기본생성자 호출
System.out.println("생성자 A");
}
}

class B extends A{
public B(){
super();//얘도 부모의 기본생성자 호출
System.out.println("생성자 B");
}
}

class C extends B{
public C(){
super(); //부모의 기본생성자 호출!
System.out.println("생성자 C");
}
}

public class ConstructorEx_2 {
public static void main(String[] args) {
C c = new C();
//호출 순서 C -> B -> A  - 부른 애가 엄마를 부릅니다 엄마도 엄마를 부릅니다 x 상속개수만큼
//실행 순서 A -> B -> C - 가장 최상위부터 
}
}

어제 의문이 해결되니까 기분이 좋당 :D

그러니까 생성자의 "첫라인" 에 super()가 있는것.

package day09;
class TV2{
public TV2(){
super();
System.out.println("TV2");
}
}


class Movie2 extends TV2{
String part="한국 영화";
public Movie2(){
super();
System.out.println("Movie2");
}
}

class Action2 extends Movie2{
String name = "";
public Action2(){
super();
System.out.println("Action2");
}
}


public class MovieTest2_3 {
public static void main(String [] args){
Action2 act = new Action2();
System.out.println("생성자 호출 끝");
act.name = "마파도";
System.out.println(act.name);
}
}

그러니까 super는 생성자 중에서도 "기본 생성자"를 호출함.

package day09;


class A1{

A1(){

System.out.println("기본생성자 A1");

}

A1(int x){

System.out.println("int형 생성자 " + x);

}

}


class B1 extends A1{

B1(){

System.out.println("기본생성자 B1");

}

}



public class ConstructorEx2_4 {

public static void main(String[] args) {

B1 b;

b = new B1();

}

}


---------------------------기본생성자가 없으면------------------------

package day09;

class A1{

A1(int x){
System.out.println("int형 생성자 " + x);
}
}

class B1 extends A1{
B1(){
System.out.println("기본생성자 B1");
}
}


public class ConstructorEx2_4 {
public static void main(String[] args) {
B1 b;
b = new B1();
}
}

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Implicit super constructor A1() is undefined. Must explicitly invoke another constructor

at day09.B1.<init>(ConstructorEx2_4.java:11)
at day09.ConstructorEx2_4.main(ConstructorEx2_4.java:20)

오류남 -_-)ㅋㅋ

package day09;

//에러요소가 잠재적으로 존재하는 경우

class Movie3 {
String part = "";

public Movie3() {
System.out.println("Movie3 기본 생성자");
}//기본 생성자

public Movie3(String part) {
this.part = part;
System.out.println("Movie3");
}//String을 받는 기본 생성자
}


class Comedy3 extends Movie3 {
String time = "";
String name = "";

public Comedy3() {

}

public Comedy3(String time, String name) {
//super();
this.time = time;
this.name = name;
System.out.println("Comedy3");
}

}

public class MovieTest3_5 {
public static void main(String [] args) {
// 파라미터가 있는 생성자만 호출합니다.
//잉 부모의 기본 생성자도 호출되는데? - 아 그냥 무조건 super()가 포함되어져 있는거임
//매개변수가 있는 생성자라도 부모는 기본 생성자로 호출한다.
//굳이 파라미터값 넣어주면 매개변수 있는 부모 생성자 호출할 수 있긴 함
Comedy3 com = new Comedy3("21:00", "마파도");

// 기본 생성자는 기존에 생성자가 없는 경우만
// 자동으로 만들어집니다.
Comedy3 com2 = new Comedy3();

// System.out.println(com.time);
// System.out.println(com.name);
}
}



-------------------------------------------------------------------
매개변수가 있는 생성자가 있는 경우에 기본 생성자가 없으면 오류난다.
근데 이거 명시적으로 자식 클래스에서 super(매개변수가 있는 생성자의 변수 타입에 맞는 값) 을 써주던가
그냥 기본 생성자를 만드는 편이 낫다.

package day09;

class A3{
public A3(int x){
System.out.println("생성자 A3");
}
}

class B3 extends A3{
public B3(){
System.out.println("생성자 B3");
}
}

public class ConstructorEx2_6 {
public static void main(String[] args) {
B3 b;
b = new B3();
}
}

이러면


고치는 법 1.


class B3 extends A3{

public B3(){

super(1);

System.out.println("생성자 B3");

}

}

이렇게 고치던가


고치는 법 2.

package day09;


class A3{

A3(){

System.out.println("기본생성자 A3");

}

public A3(int x){

System.out.println("생성자 A3");

}

}


class B3 extends A3{

public B3(){

System.out.println("생성자 B3");

}

}


public class ConstructorEx2_6 {

public static void main(String[] args) {

B3 b;

b = new B3();

}

}


이렇게 그냥 기본 생성자를 만들어준다.

package day09;


class A4 {


A4() {

System.out.println("기본 생성자 A4");

}


public A4(int x) {

System.out.println("매개변수 생성자 A4");

}


}


class B4 extends A4 {

public B4() {

System.out.println("기본 생성자 B4");

}


public B4(int x) {

// 기본적으로 매개변수가 있어도

// super(); //가 생략된 것이라

// 매개변수 있는 생성자도 부모는 기본생성자

// 를 호출한다.


// super(1); //굳이 파라미터값 넣어주면

// 매개변수 있는 생성자 호출 가능


System.out.println("매개변수 생성자 B4");

}


}


public class ConstructorEx3_7 {

public static void main(String[] args) {

B4 b = new B4(10);


}

}


재밌음.

질문 1> 서브 클래스의 인스턴스가 생성될 때 서브 클래스의 생성자와 슈퍼 클래스의 생성자가 모두 실행되는가?

            아니면 서브 클래스의 생성자만 실행되는가?

둘다 실행됨

질문 2> 서브 클래스의 인스턴스가 생성될 때 서브 클래스의 생성자와 슈퍼 클래스의 생성자의 실행 순서는 어떻게 되는가?

실행: 최상위 슈퍼 클래스 -> 최하위 서브 클래스
호출: 최하위 자식 클래스 -> 최상위 부모 클래스

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

this: 메소드안에서 자기 자신을 가리키는 객체 변수
메소드를 호출한 객체의 해시코드(주소)를 가지고 있음
사용 - this.멤버변수 
this() - 현재 클래스 생성자 호출

super: 메소드안에서 상위 클래스 객체를 나타내는 객체 변수
상속에서 부모객체가 은닉이 되버리니까 접근할 수 있는 방법!
사용 - super.멤버변수
super() - 부모 클래스 생성자 호출

생성자: new를 이용하여 메모리 할당이 끝난 후 메모리를 초기화하는 역할을 한다.
멤버 변수에 초기값을 할당한다. 

package day09;
class This{
String area = "서울시";
public void prn(){
// System.out.println("이 메소드를 호출한 객체의 HashCode \n" + this);
//그냥 this라고 쓰면
//16진수 형태의 해시코드가 출력된다
System.out.println("이 메소드를 호출한 객체의 HashCode \n" + this.hashCode());

System.out.println(this.area);
}
}

public class ThisTest_8 {
public static void main(String[] args) {
This obj1 = new This();
obj1.area = "인천시";
obj1.prn();
//객체의 HashCode가 prn() 메소드로 호출된다.
System.out.println("obj1.hashCode()\n" + obj1.hashCode());
}
//this.hashCode()랑 obj1.hashCode()랑 같은거임
//main(static)에서는 객체 생성 전에 메모리를 잡은거라
//static에서는 this나 super는 쓸 수 없음.
}

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

Super!

package day09;

class School{
int year = 0;
public School(){
// System.out.println("생성자1!");
this.year = 0;
}
}

class MiddleSchool extends School{
int year = 0;
//이러면 부모의 year는 은닉됨!
//출력하고 싶으면 super.year
public MiddleSchool(){
// System.out.println("생성자2!");
this.year = 3;
}
public void prn(){
//print였음... -_-);;
System.out.println("year: " + year);
System.out.println("this.year: " + this.year);
System.out.println("super.year: " + super.year);
//super는 부모클래스
}
}



public class SuperTest_9 {
public static void main(String[] args) {
MiddleSchool middleSchool = new MiddleSchool();
middleSchool.prn();
}
}

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

package day09;

class SuperObject{
protected String name;
public void paint(){
draw();
}
public void draw(){
System.out.println(name);
}
}


public class SubObject_10 extends SuperObject{
protected String name;
public void draw(){
name = "Sub";
super.name = "Super";
super.draw();
System.out.println(name);
}
//그럼 출력이
//super - sub
public static void main(String[] args) {
SuperObject b = new SubObject_10();
//이거 ... 업캐스팅!
b.paint();
//그래서 SuperObject의 name을 호출해도
//은닉되어져서 super.draw()을 호출하지 않으면
//SubObject_10의 draw()가 출력된다.
System.out.println(b.name);
//근데 왜 b.name은 Super로 나오지...
//왜 안 Sub여 - 은닉이라며!
//아 변수는 오버라이딩 개념이 아니었슴미다
//아 머리아파!
//오버로딩 오버라이딩은 메소드에만 적용됨
}
}

this() 생성자는 파워복붙했음

파워복붙

package day09;
class ThisData{ 
    int i; 
    int j; 
    int k; 
     
    //ⓐ 
    public ThisData(){ 
        this.i=0; 
        this.j=0; 
        this.k=0; 
    } 
     
    //ⓑ 
    public ThisData(int i){ 
        this.i=i; 
    } 
     
    //ⓒ 
    public ThisData(int i, int j){ 
    //super();
        this(i);  //ⓑ 호출되어 초기화됩니다. 
        this.j=j;
    } 
} 

public class ThisExam_11 { 
    public static void main(String[] args) { 
        ThisData od = new ThisData(100, 90); 
         
        System.out.println("od.i: " + od.i); 
        System.out.println("od.j: " + od.j); 
        System.out.println("od.k: " + od.k);         
    } 
} 

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

super 생성자는 그냥 씀

package day09;

class OverC{
int i;
int j;
public OverC(int i, int j){
this.i = i;
this.j = j;
}
public OverC(){
System.out.println("OverC의 기본 생성자");
}
void show(){
System.out.println("상위 클래스의 메소드 show() 수행");
}
}



class SubOverC extends OverC{
int k;
public SubOverC(int i, int j, int k){
super(i,j);
this.k = k;
}
void show(){
System.out.println("하위 클래스의 메소드 show() 수행");
System.out.println("==super를 이용한 상위 클래스 메소드 호출==");
super.show();
}
}

public class SuperExam_12 {
public static void main(String[] args) {
SubOverC over1 = new SubOverC(10,20,30);
System.out.println("i,j,k의 값: " + over1.i + " " + over1.j + " " + over1.k);
//이건 그냥 10 20 30 출력될건데 
//출력되는 과정에서 super(i,j)해서 부모 생성자 호출함
over1.show();//하위 + 상위 출력
}
}

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

Abstract Class (추상 클래스)

Abstract Method (추상 메소드)

- 기능이 구현되지 않고 원형만 선언되어 있는 메소드인데
이거는 {} 안써도됨

추상 메소드가 있으면 추상 클래스

그냥 선언을
abstract public void draw();
이런 식으로 만들어놓고 자식 클래스에서 오버라이딩함! :D

오버라이딩 안하면 껍데기여서 무쓸모인것
심지어 오버라이딩 안하면 안 한 서브클래스도 추상메소드 취급당해서 못씀 ㅋㅋㅋㅋ

추상 메소드가 1개라도 있으면 추상 클래스!
근데 추상 클래스 
abstract class Line{} <- 이렇게 만들고 추상 메소드 없어도 추상 클래스

그리고 얘는 객체를 생성할 수 없기 때문에
서브 클래스 필수쉰것

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

package day09;

abstract class Calculator {
public abstract int add(int a, int b);

public abstract int subtract(int a, int b);

public abstract double average(int[] a);

}

public class GoodCalc extends Calculator {

@Override
public int add(int a, int b) {
return a + b;
}

@Override
public int subtract(int a, int b) {
// TODO Auto-generated method stub
return a - b;
}

@Override
public double average(int[] a) {
double sum = 0;
double avg = 0;

for (int i = 0; i < a.length; i++) {
sum += a[i];
}

avg = sum / a.length;

return avg;
}

public static void main(String[] args) {
GoodCalc david = new GoodCalc();
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

System.out.println("합  : " + david.add(10, 20));
System.out.println("차  : " + david.subtract(20, 10));
System.out.println("평균: " + david.average(arr));

}

}
이 상태인데 

GoodCalc 입력받고 출력받는 메소드 만들기

package day09;

import java.text.DecimalFormat;
import java.util.Scanner;

abstract class Calculator {

public abstract int add();
// 합

public abstract int subtract();
// 차

public abstract double average();
// 배열의 평균값

public abstract void inputValue();
// 값 삽입

public abstract void printValue();
// 값 출력

}

public class GoodCalc extends Calculator {

int a;
int b;
int arrnum = 0;
int arr[] = new int[2];

@Override
public int add() {

return a + b;
}

@Override
public int subtract() {
return a - b;
}

@Override
public double average() {
String avgSample = "";
double avg = 0;
DecimalFormat d = new DecimalFormat(".##");

avgSample = d.format((double) arr[0] / arr[1]);
avg = Double.parseDouble(avgSample);
return avg;
}

@Override
public void inputValue() {
Scanner s = new Scanner(System.in);
System.out.println("첫번째 숫자를 입력해 주세요.");
a = s.nextInt();
System.out.println("두번째 숫자를 입력해 주세요.");
b = s.nextInt();

System.out.println("배열에 입력하실 숫자의 개수를 입력해 주세요.");
arrnum = s.nextInt();

int arr[] = new int[arrnum];

for (int i = 0; i < arrnum; i++) {
System.out.println("배열의" + (i + 1) + "번째 숫자를 입력해 주세요.");
arr[i] = s.nextInt();

if (i == arrnum - 1) {
System.out.println("배열에 입력이 완료되었습니다.\n");
}
} // end for

for (int i = 0; i < arrnum; i++) {
this.arr[0] += arr[i];
} // end for

this.arr[1] = arrnum;

System.out.println("숫자 입력이 완료되었습니다.\n");
}

@Override
public void printValue() {
System.out.println("합  : " + add());
System.out.println("차  : " + subtract());
System.out.println("평균: " + average());
}

public static void main(String[] args) {
GoodCalc david = new GoodCalc();

david.inputValue();
david.printValue();

}

}

------------------------------출력은 되는데 처음 선생님이 준 메소드로 다시 변환해보기------
package day09;

import java.text.DecimalFormat;
import java.util.Scanner;

abstract class Calculator {

public abstract int add(int a, int b);
// 합

public abstract int subtract(int a, int b);
// 차

public abstract double average(int[] a);
// 배열의 평균값

public abstract void inputValue();
// 값 삽입

public abstract void printValue();
// 값 출력

}

public class GoodCalc extends Calculator {

private int a;
private int b;
private int arrnum = 0;
private int arr[] = new int[2];

public int getA() {
return a;
}

public void setA(int a) {
this.a = a;
}

public int getB() {
return b;
}

public void setB(int b) {
this.b = b;
}

public int getArrnum() {
return arrnum;
}

public void setArrnum(int arrnum) {
this.arrnum = arrnum;
}

public int[] getArr() {
return arr;
}

public void setArr(int[] arr) {
this.arr = arr;
}

@Override
public int add(int a, int b) {

return a + b;
}

@Override
public int subtract(int a, int b) {
return a - b;
}

@Override
public double average(int[] a) {
String avgSample = "";
double avg = 0;
DecimalFormat d = new DecimalFormat(".##");

avgSample = d.format((double) arr[0] / arr[1]);
avg = Double.parseDouble(avgSample);
return avg;
}

@Override
public void inputValue() {
Scanner s = new Scanner(System.in);
System.out.println("첫번째 숫자를 입력해 주세요.");
a = s.nextInt();
System.out.println("두번째 숫자를 입력해 주세요.");
b = s.nextInt();

System.out.println("배열에 입력하실 숫자의 개수를 입력해 주세요.");
arrnum = s.nextInt();

int arr[] = new int[arrnum];

for (int i = 0; i < arrnum; i++) {
System.out.println("배열의 " + (i + 1) + "번째 숫자를 입력해 주세요.");
arr[i] = s.nextInt();

if (i == arrnum - 1) {
System.out.println("배열에 입력이 완료되었습니다.\n");
}
} // end for

for (int i = 0; i < arrnum; i++) {
this.arr[0] += arr[i];
} // end for

this.arr[1] = arrnum;

System.out.println("숫자 입력이 완료되었습니다.\n");
}

@Override
public void printValue() {
System.out.println("합  : " + add(a, b));
System.out.println("차  : " + subtract(a, b));
System.out.println("평균: " + average(arr));
System.out.println("숫자 출력이 완료되었습니다.");
}

public static void main(String[] args) {
GoodCalc david = new GoodCalc();

david.inputValue();
david.printValue();

}

}


------------------------------------이렇게 하면 되지만 메소드 그대로 안 짜도 될 거 같음 - 어짜피 연습인것...

----------밥먹었음!!! ---------------------------

Final 클래스
String 같은 건

public final class String extends Object implements Serializable, Comparable, CharSequence 


public class FinalTest extends String{  //ERROR 

} 

요렇게 생겨서 extends 못함 ㅠㅠ = 상속 = 확장 불가 :<

상수 선언! : 다시 읽어보기! :D

--------------------------------------------
[18] 인터페이스

Interface는 상수와 추상 메소드로만 이루어져 있음! - 메소드도 {} 없음
모든 추상메소드에 public이랑 abstract가 들어간거라 안 써도 된당! :>

추상메소드는 앞으로 추가되거나 구현되는 기능의 설계역할! - 실제 기능 구현 x 메소드 원형만 구현 o!

외부에 공개한 메소드를 등록하는 목적 - 인터페이스를 통하면 안 보여주고 싶은 메소드 숨김 가능!

클래스 - 인터페이스 - 클래스 연결하는 것

인터페이스를 구현한 클래스는 추상 메소드 전부 구현 필요! - 한개라도 안 하면 추상클래스됨
인터페이스는 객체 생성 불가능


ㅇㅇ 생략 가능


package day09;

interface Inter{
public abstract int add(int i, int j);
//저거 이거랑 똑같음 int add(int i, int j);
public int sub(int i, int j);
//abstract 생략
}

public class InterImpl implements Inter{

@Override
public int add(int i, int j) {
return i+j;
}

@Override
public int sub(int i, int j) {
return i-j;
}
public static void main(String[] args) {
InterImpl interImpl = new InterImpl();
System.out.println(interImpl.add(10, 5));
System.out.println(interImpl.sub(10, 5));
//인터페이스는 기능이 구현되어 있지 않음으로
//객체 생성 불가능
//Inter inter = new Inter();
//인터페이스는 구현 클래스를 할당 받을수 있음
//인터페이스 = 구현페이스 <- 형식으로
Inter inter2 = new InterImpl();
System.out.println(inter2.add(100, 50));
System.out.println(inter2.sub(100, 50));
Inter inter3;
inter3 = new InterImpl();
//위에거랑 같은건데 그냥 두줄로 쓰고 싶어서
System.out.println(inter3.add(1000, 500));
System.out.println(inter3.sub(1000, 500));
 
}

}

이런 식으로 쓰면 됨
2. 인터페이스의 참조 

   - 각 클래스의 멤버 변수에 접근하는 경우는 그 클래스 타입으로 형변환을 
     해 주어야 합니다. 
   - 인터페이스 타입  객체 = new 인터페이스 구현 클래스  

어 이거할때 딴생각함ㅠㅠ

package day09;

interface B101 {
void display(String s);
}

class D101 implements B101 {
String str = "";

public void display(String s) {
str = s;
System.out.println("★☆★☆★☆★☆★☆" + s);
}
}

class D102 implements B101 {
String str = "";

public void display(String s) {
str = s;
System.out.println("☆★☆★☆★☆★☆★" + s);
}
}

public class IR2 {
public static void main(String[] args) {
B101 b = new D101();
//클래스 D101의 객체를 생성해서 b에 할당
//어 그러니까 업캐스팅:D!
b.display("석모도 - 보문사 - 벤댕이 회무침");

b = new D102();
b.display("대부도 - 방아머리 - 바지락 칼국수");

//인터페이스 타입은 구현 클래스의
//변수에 접근할 수 없습니다.
//System.out.println(b.str);
//구현 객체의 멤버변수에 접근하려면
//인터페이스의 구현 클래스 타입으로
//형변환을 합니다
D102 d2 = (D102) b;
//다운캐스팅! :>
System.out.println(d2.str);

}
}



오 근데 인터페이스는 여러개 implements 할 수 있음 :>
= 여러개 상속! :0!

package day09;

interface Green{
public String greenColor();
}

class GreenImpl implements Green{
public String greenColor(){
return "초록색입니다.★";
}
}

interface Red{
public String redColor();
}

class RedImpl implements Red{
public String redColor(){
return "빨간색입니다.★";
}
}

class ColorImpl implements Green, Red{
public String greenColor(){
return "★초록색입니다.";
}
public String redColor(){
return "★빨간색입니다.";
}
} //요렇게 인터페이스는 >>,<<로 다중 implements 가능! :>
//이럴 경우에는 얘네가 가지고 있는 추상 메소드
//모두 다 구형해줘야함! :>


public class ColorMain {
public static void main(String[] args) {
Green g = new GreenImpl();
System.out.println(g.greenColor());
Red r = new RedImpl();
System.out.println(r.redColor());
ColorImpl c = new ColorImpl();
System.out.println(c.greenColor());
System.out.println(c.redColor());
}
}
=======================잠깐잘래------------------------
------------------------쉬었음==========================

package day09;

interface MyinfoInter{
public String getName();
public String getPhone();
}

class Myinfo implements MyinfoInter{
private String name;
private String phone;
private String address;
private int age;
Myinfo(){}
Myinfo(String name, String phone, String address, int age){
this.name = name;
this.phone = phone;
this.address = address;
this.age = age;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return name;
}
public void setName(String name){
this.name = name;
}
@Override
public String getPhone() {
// TODO Auto-generated method stub
return phone;
}
public void setPhone(String phone){
this.phone = phone;
}
public String getAddress(){
return address;
}
public void setAddress(String address){
this.address = address;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}


public class MyinfoUse {
public static void main(String[] args) {
MyinfoInter info = new Myinfo("길동","0101010101","인천시 남동구", 35);
System.out.println("이름: " + info.getName());
System.out.println("전화: " + info.getPhone());
System.out.println("주소: " + info.getAddress());
System.out.println("나이: " + info.getAge());
}
}

----------------------------------이건 에러 뜬다!

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
The method getAddress() is undefined for the type MyinfoInter
The method getAge() is undefined for the type MyinfoInter

at day09.MyinfoUse.main(MyinfoUse.java:67)

----------------------------------------이런 에러!
이유는 업캐스팅 했는데 얘는 모르는 메소드라서 그럼 :<

이거 StarUml로 그려볼거임


얘 타입 바꾸는 법



이렇게 바뀜



이거는 인터페이스 구현해줬다는 뜻...




위에 소스 uml로 구현해본것...


CLASS 부분 10번 보기! :D


ㅇㅇ 이렇게 클래스가 끝났음다

재밌당 ^^... 우리의친구 같은것




자바 - 예외처리! - Exception 


예외는 운영중에 발생하는 에러! :D
코딩중에 발생하는 에러가 아니라 컴파일시 에러인것 ... - 이걸 실행하기 전에 잡아야함 넘나재미있는것... -.,-)

예외 때문에 다른애들 죽지 말라고 얘 이상해도 다른애 잘 돌아갈 수 있게 하는 것 <--


finally는 예외가 나든지 말든지 무조건 실행해야 하는 것.


요렇게.


ArrayIndexOutOfBoundsException - a[9] 만들어놓고 a[10] 접근하면 생김
StringIndexOutOfException도 있음 - 
홍 길 동  안 녕 하세 요
0 1  2  3  4  5  6  7  8   -인데 10에 접근하려고 하면 스트링 인덱스 아웃오브 익셉션

NumberFormatException - Integer.ParseInt같은 데서 잘못된 타입 받으면 이런거 뜸

근데 넘 많으니까 여기 위에 거 정도만 외워두기...

try{
개발자가 에러가 발생할 소지가 있는 코드를 선별해서 지정해야 한다.   
}catch(Exception e){
예외처리 및 예외처리 원인 출력
}
finally{
무조건 실행되는 코드 블럭, 데이터베이스 연결 종료 등
}

--------------------------코드--------------------

package day09;

public class Ex1 {
public static void main(String[] args) {
int a = 10;
int b = 0;
// if(b==0){
// System.out.println("0으로 나눌 수 없습니다.");
// System.exit(0);
// }
System.out.println("a = " + a + " b = " + b);
System.out.println("a/b = " + (a/b));
System.out.println("나눗셈이 수행되었습니다.");
}
}

a = 10 b = 0Exception in thread "main" 
java.lang.ArithmeticException: / by zero
at day09.Ex1.main(Ex1.java:14)

------------------------------------------------arithmeticException 뜸

package day09;

public class Ex1 {
public static void main(String[] args) {
int a = 10;
int b = 0;

// if(b==0){
// System.out.println("0으로 나눌 수 없습니다.");
// System.exit(0);
// }
try {// 에러가 발생될 소지가 있는 곳
System.out.println("a = " + a + " b = " + b);
System.out.println("a/b = " + (a / b));
System.out.println("나눗셈이 수행되었습니다.");
} catch (Exception e) {// 예외처리 및 예외처리 원인 출력
e.printStackTrace();// 이러면 원인 출력됨
} finally {// 무조건 나오는 곳
System.out.println("정리코드 입니다.");
}

System.out.println("프로그램이 정상적으로 끝납니다.");

}
}

요렇게 트라이캐치문으로 묶어주면

a = 10 b = 0
정리코드 입니다.
프로그램이 정상적으로 끝납니다.
java.lang.ArithmeticException: / by zero
at day09.Ex1.main(Ex1.java:14)

끝나기는 정상적으로 끝남 :>
------------------------------------------------------
package day09;

public class Ex2 {
public static void main(String[] args) {
String str = null;
char s = str.charAt(5); //5번째 해당하는 인덱스값을 가짐
System.out.println("s:" + s);
System.out.println("프로그램 실행을 끝냅니다.");
}
}

이러면 널 포인터 익셉션

Exception in thread "main" java.lang.NullPointerException
at day09.Ex2.main(Ex2.java:6)

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

package day09;

public class Ex2 {
public static void main(String[] args) {
String str = "홍길동";
try{
char s = str.charAt(5); //5번째 해당하는 인덱스값을 가짐
System.out.println("s:" + s);

}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("프로그램 실행을 끝냅니다.");
}
}
}

요러면

java.lang.StringIndexOutOfBoundsException: String index out of range: 5
at java.lang.String.charAt(String.java:658)
at day09.Ex2.main(Ex2.java:9)
프로그램 실행을 끝냅니다.

---------------------------------ㅋㅋㅋ스트링인덱스아웃오브바운즈익셉션

예외 선언은 첨에는 좁은 범위 -> 담에는 넓은 범위 예외를 명시함

java.lang.Object     
  | 
  +--java.lang.Throwable 
        | 
        +--java.lang.Exception                                 <--- 가장 넓은 범위 
              | 
              +--java.lang.RuntimeException 
                    | 
                    +--java.lang.IllegalArgumentException 
                          | 
                          +--java.lang.NumberFormatException   <--- 가장 좁은 범위, 여기부터 catch문에 명시 

사실 잘 모르면 그냥 Exception으로 받고 생각해야지 :>
>>>>> ExceptionError1.java 
class ExceptionError1 { 
  public static void main(String args[]) { 
  
   try { 
      System.out.println("매개변수로 받은 두 개의 값"); 
      int a = Integer.parseInt(args[0]);    // 문자열 값을 정수로 변환 
      int b = Integer.parseInt(args[1]); 
      System.out.println(" a = " + a + " b = " + b ); 
      System.out.println(" a를 b로 나눈 몫 = " + (a/b) ); 
      System.out.println("나눗셈이 원할히 수행되었습니다."); 
    } 
    catch(ArithmeticException e) { 
      System.out.println("=================================="); 
      System.out.println("ArithmeticException 처리 루틴 : "); 
      System.out.println(e + " 예외 발생"); 
    } 
    catch(ArrayIndexOutOfBoundsException e) { 
      System.out.println("=================================="); 
      System.out.println("ArrayIndexOutOfBoundsException 처리 루틴"); 
      System.out.println(e + " 예외 발생"); 
    } 
    catch(NumberFormatException e) { 
      System.out.println("=================================="); 
      System.out.println("NumberFormatException 처리 루틴"); 
      System.out.println(e + " 예외 발생"); 
    } 
    catch(Exception e) { 
        System.out.println("=================================="); 
        System.out.println("알수없는 문제가 발생했습니다."); 
        System.out.println(e.toString());         
    } 
    finally { 
      System.out.println("=================================="); 
      System.out.println("예외 처리를 끝내고 finally 블럭을 수행합니다"); 
    } 
    System.out.println("나머지 모듈 정상 작동!!!"); 
  } 
} 

이거 파워 복붙인데 뭔가 오류남 :< 재부팅!

사실 요즘 세상이 좋아져서 이클립스가 try catch 다 알려줌 ㅋㅋㅋㅋ


와 혼란스럽다 :D



   - 메소드에 throws절을 명시하면 try~catch문을 사용하지 않아도 됩니다. 


이걸
package day09;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Ex3 {
public static void main(String[] args) {
Connection con = null;
try {
con = DriverManager.getConnection("", "", "");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(con != null){
con.close();
}
}
}
}

이걸 그냥 쓰긴 헀음 ... - 어려움../



5. 수업

진도: 

hw: 


6. 할것


업캐스팅 예제 풀어보기.

업캐스팅 다운캐스팅 용도를 찾아보기

abstract 메소드로 BMO 연구하기


클래스 관련 모르는 것 체크해보기

페로봇 인터페이스로 짜보기


영어공부도 같이 하기! - 아 이번 토익 봐야함 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 4월에 끝남...


으아아 정보처리기사도봄

그리고 토익도봄

그리고 ocjp도봄


다봄


봄봄봄봄이왔네요


Exception 들어간 Calc 만들어보기 

foreach - 는 배열이랑 컬렉션은 가능... - 인데 나중에 배운댕 :>


그래도 일괄처리하는 배열에 쓰면 편하니까!

'Programming' 카테고리의 다른 글

160328: 11회차  (5) 2016.03.28
160325: 10회차  (0) 2016.03.25
160323: 8회차  (1) 2016.03.23
160322: 7회차  (4) 2016.03.22
160321: 6회차  (1) 2016.03.21
Posted by DAVID

160323: 8회차

Programming 2016. 3. 23. 11:27

종료하기 전 티스토리 네이버 로그아웃 할 것

가끔 저장 해놓기.


1. 툴

동일

추가시: staruml 5.0


staruml-5.0-with-cm.vol1.egg

staruml-5.0-with-cm.vol2.egg

staruml-5.0-with-cm.vol3.egg



2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시: \\172.16.3.249 


4. 공부하는 것


오늘부터 상속!

: 부모가 자식한테 물려주는 것


부모(상위 클래스)의 특성(필드,메소드)를 자식(하위 클래스)에게 물려주는 것

superclass                             subclass

basicclass                            

기본 클래스                            확장 클래스

특성을 물려주는 상위 클래스             특성을 물려받는 하위 클래스


부모의 특성을 재정의할 필요가 없어서 정의가 간결해짐 


이거는 멤버 변수보다는 메소드를 상속하려고 쓰는 건데

부모 클래스 기능 확장할 때 얘를 직접 수정하지 않고 자식이 기능을 확장해서 씀 (메소드 추가!)

- 만약에 부모가 + 랑 - 기능 있으면 - 자식이 %랑 *랑 / 기능 만들면 부모가 주는 +랑 - 기능을 안 써놔도 쓰기 가능


기능이란 건 메소드란 뜻


구래서 기본 + 메소드 확장해서 쓰니까 자식클래스가 확장클래스


상속을 계속계속 하게 될 경우에는 기능이 짱 많아짐.

근데 a(부모) -> b(자식) 인 경우에 c(부모) -> b(자식) 이렇게 여러 클래스를 상속하지는 못함 

(자바에서는 못함... c++에서는 가능이긴 한데 복잡한것)


상속을 안 쓰면 같은 기능을 쓰는 클래스가 여러개인데 상속 받으면 편함



이런 식으로 부모1 -> 부모2(부모1의 자식) -> 자식(부모2의 자식) 가능


상속 쓰는 법은


public class a{

} //맨 처음 부모 클래스

public class b extends a{

//a를 상속받는 클래스 b인것

}

public class c extends b{

//b를 상속받는 클래스 c인것

}


이렇게 쓰는 예시

package day08;


class Movie{

String prat = "영화";

}


class KorMovie extends Movie{

String m1 = "가문의 위기";

}


class ForMovie extends Movie{

String m1 = "박물관이 살아있다.";

}



public class MovieTest {

public static void main(String[] args) {

KorMovie k = new KorMovie();

System.out.println("장르: " + k.prat);

System.out.println("제목: " + k.m1);

ForMovie f = new ForMovie();

System.out.println("장르: " + f.prat);

System.out.println("제목: " + f.m1);

}

}


이런 식으로 부모 클래스의 변수를 선언 안 해도 쓸 수 있음
KorMovie/ForMovie의 prat


package day08;


class Movie{

String prat = "영화";

}


class KorMovie extends Movie{

String m1 = "가문의 위기";

}


class KorMovie2 extends KorMovie{

String m1 = "가문의 위기2";

}


class ForMovie extends Movie{

String m1 = "박물관이 살아있다.";

}



public class MovieTest {

public static void main(String[] args) {

KorMovie k = new KorMovie();

System.out.println("장르: " + k.prat);

System.out.println("제목: " + k.m1);

KorMovie2 k2 = new KorMovie2();

System.out.println("장르: " + k2.prat);

System.out.println("제목: " + k2.m1);

ForMovie f = new ForMovie();

System.out.println("장르: " + f.prat);

System.out.println("제목: " + f.m1);

}

}


요런 식으로 


Movie -> KorMovie -> KorMovie2 인 경우에도 멤버변수 잘 쓸 수 있음



<<메모리친구>>

KorMovie k 생성시 Movie객체(그 전에 Object)를 먼저 만듬 - k.m1은 이 Movie객체도 접근 가능

- 항상 부모 영역 부터 만들고 쓰는 거라 상속 많이 쓰면 메모리 많이 먹음...

- Object 같은 거 쓰는 건 .hashCode() 이런 거 출력할 때 쓰는거임


사실 상속 쓸 때 무조건 private 멤버함수를 쓰니까 setter랑 getter 필수


//메소드 상속 


package day08;


class Car {

public void gear() {

System.out.println("수동 기어를 사용합니다.");

}

}


class ChildCar extends Car {

public void auto_gear() {

System.out.println("자동 기어를 사용합니다.");

}

}


class ChildCar2 extends ChildCar {

// public void gear(){

// System.out.println("수동 기어를 사용하지 않습니다.");

// }

public void auto_gear2() {

System.out.println("수동/자동 기어를 혼합하여 사용합니다.");

}


}


public class CarTest {

public static void main(String[] args) {

ChildCar2 cc2 = new ChildCar2();

cc2.gear();

cc2.auto_gear();

cc2.auto_gear2();

}

}

출력하면 부모 클래스에서 선언해놓은 메소드대로 잘 나옴.

class Car {
public void gear() {
System.out.println("수동 기어를 사용합니다.");
}
}
이거는 사실

class Car extends java.lang.Object{
public void gear() {
System.out.println("수동 기어를 사용합니다.");
}
}
이거랑 같은 말인데
Object는 모든 클래스가 부모로 가지고 있는 애라서 생략 가능 

cc2를 만들면
object - car - childcar - childcar2 영역이 만들어짐

그래도 해시코드는 childcar2 거만 cc2가 가지고 있는것 



이렇게 보면 Object 상속받은 거 볼 수 있음.


그러니까 Object가 java.lang 패키지 내의 최상위 클래스인데 




이런 클래스 구조도를 가지고 있음

출처: http://hyeonstorage.tistory.com/178


사용자가 클래스를 정의할 떄 extends java.lang.Object 를 안 도 자동으로 상속받게 되어

Object 클래스의 모든 메소드와 변수를 사용자가 만드는 모든 클래스에서 사용 가능하다.


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

starUML 써보는 것


Empty project -> 모듈 익스플로러에 있는 거 f2 누르면 이름 변경 가능 -> package 상속 생성

상속 -> add Diagram -> class Diagram


Annotation 에서 더블클릭 해서 클래스 생성 후 Select(화살표 모양) - 하면 선택 가능


클래스에서 선택해서 Add attribute랑 Add operation 할 수 있음 (멤버랑 메소드)



-prat: string  = 이거는 private 타입 String 변수임

String 안하고 starUML에서는 소문자 string


이걸 상속으로 만드려면

Generalization (상속) 누르고 그냥 부모한테 연결해 주면 됨


메인은 

+main(args :string[]): void = +는 public 타입 

그리고 static 변경법은 

model Explorer 에서 - 밑에 properties 보면 detail에 OwnerScope를 CLASSIFIER로 변경해 주면 static으로 바뀐다.


Association - 양방향 이용 가능

DirectedAssociation - 한방향만 이용중인 것 




<- 같이 생긴 건  : DirectedAssociation

◁- 같이 생긴 건 : Generalization


접근하는 건 위로만 올라감 (반대로 내려오면 안된다.)



CarTest.java는 이렇게.


-----------------------3교시---------------------


package day08;


class A {

public int p;

private int n;


public void setN(int n) {

this.n = n;

}


public int getN() {

return n;

}

}


class B extends A {

private int m;


public void setM(int m) {

this.m = m;

}


public int getM() {

return m;

}


public String toString() {

String s = getN() + " " + getM();

return s;

}


}


public class Main {

public static void main(String[] args) {

A a = new A();

a.setN(0);

System.out.println(a.getN());


B b = new B();

b.setN(1);

b.setM(2);

System.out.println(b.toString());

}

}


항상 class 만들어지면 object class 를 상속받는 것

- protected 는 같은 패키지면 접속 가능

package day08;

class A2{
int i;
public int pub;
protected int pro;
private int pri;

}

public class B2 extends A2{
void set(){
i = 4;
pub = 3;
pro = 2;
pri = 1;
}
void printout(){
System.out.println("i   :" + i);
System.out.println("pub :" + pub);
System.out.println("pro :" + pro);
System.out.println("pri :" + pri);
}
public static void main(String[] args) {
B2 b = new B2();
b.set();
}
}

이거는 private를 setter getter를 안 만들어서 오류나니까
package day08;

class A2{
int i;
public int pub;
protected int pro;
private int pri;
public void setPri(int pri){
this.pri = pri;
}
public int getPri(){
return pri;
}
}

public class B2 extends A2{
void set(){
i = 4;
pub = 3;
pro = 2;
setPri(1);
}
void printOut(){
System.out.println("i  : " + i);
System.out.println("pub: " + pub);
System.out.println("pro: " + pro);
System.out.println("pri: " + getPri());
}
public static void main(String[] args) {
B2 b = new B2();
b.set();
b.printOut();
}
}


요렇게 하면 출력 가능
어쨌든 protected는 같은 패키지 내에서 공유 가능이긴 한데 잘 안 쓸 거 같다...
그리고 default인 friendly는 그냥 안쓰는거보고 부르는 것... -.-) 굳이 friendly 라고 쓰면 오류남

이거 갑자기 궁금해서 써봄
try {
System.in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.in.close(); 한 다음에 try catch문 넣어줘야 함.


------------다른 패키지의 상속관계--------------------


package pb;


import pa.A3;


//package pa;

//

//public class A3 {

// int i;

// public int pub;

//

// protected int pro;

// private int pri;

//}



public class B3 extends A3{

void set(){

// i = 1; //default 멤버는 접근 불가능

pro = 2;

// pri = 3;//private 멤버도 접근 불가능

pub = 4;

}

void printSet(){

// System.out.println("i   : " + i);

System.out.println("pro : " + pro);

// System.out.println("pri : " + pri);

System.out.println("pub : " + pub);

}

public static void main (String args []){

B3 b = new B3();

b.set();

b.printSet();

}

}


패키지가 다른 클래스를 가져올 경우에 import pa.A3; 해줘야 상속 가능하다.

----------------------------------------------------------------------------------------- 
접근 제한자   같은 클래스    같은 패키지    상속관계의 다른 패키지    관련없는 다른 패키지 
                             (같은 폴더)        (폴더 상관없음)          (다른 폴더)   
------------ ----------------------------------------------------------------------------- 
private          ○               X                 X                       X  (중요) 
----------------------------------------------------------------------------------------- 
friendly         ○               ○                X                       X 
----------------------------------------------------------------------------------------- 
protected        ○               ○                ○                      X   
------------------------------------------------------------------------------------------ 
public           ○               ○                ○                     ○ (중요) 
------------------------------------------------------------------------------------------ 

여기서 보면 protected는 남의 패키지라도 상속중이면 사용이 가능해서 오류나지 않는다.

근데 default = friendly는 상속중이더라도 남의 패키지면 사용이 불가능하다.


그래서 


package pb;


import pa.A3;


/*

 * package pa;


public class A3 {

public int pub;

protected int pro;

private int pri;

public int getPri(){

return pri;

}

public void setPri(int pri){

this.pri = pri;

}

int i;

public int getI(){

return i;

}

public void setI(int i){

this.i = i;

}

}


 * 

 * */


public class B3 extends A3{

void set(){

setI(1); //default 멤버는 접근 불가능

pro = 2;

setPri(3);//private 멤버도 접근 불가능

pub = 4;

}

void printSet(){

System.out.println("i   : " + getI());

System.out.println("pro : " + pro);

System.out.println("pri : " + getPri());

System.out.println("pub : " + pub);

}

public static void main (String args []){

B3 b = new B3();

b.set();

b.printSet();

}

}


이렇게 public으로 접근할 수 있는 setter랑 getter가 필요하다.
근데 남의 패키지에서 가져다 쓰려면 어짜피 세터랑 게터 만들거라서 default 타입 안쓰고 private로 쓴다.
안전하게!


JVM은 

0. 생성자 자동으로 만들어 줌

1. java.lang 패키지는 자동 import  

2. object 클래스는 클래스 자동 상속


//이렇게 하면 출력까지 됨


package pb;


import pa.A3;


/*

 * package pa;


public class A3 {

public int pub;

protected int pro;

private int pri;

public int getPri(){

return pri;

}

public void setPri(int pri){

this.pri = pri;

}

int i;

public int getI(){

return i;

}

public void setI(int i){

this.i = i;

}

}


 * 

 * */


public class B3 extends A3 {

void getValue() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.println("i 값을 입력해주세요.");

setI(s.nextInt()); // default 멤버는 접근 불가능

System.out.println("pro 값을 입력해주세요.");

pro = s.nextInt();

System.out.println("Pri 값을 입력해주세요.");

setPri(s.nextInt());// private 멤버도 접근 불가능

System.out.println("pub 값을 입력해주세요.");

pub = s.nextInt();

}


void printValue() {

System.out.println("i   : " + getI());

System.out.println("pro : " + pro);

System.out.println("pri : " + getPri());

System.out.println("pub : " + pub);

}


public static void main(String args[]) {

B3 b = new B3();

b.getValue();

b.printValue();

}

}


스캐너 import 를 전역으로 하는 게 낫나 아니면 쓸때마다 java.util.Scanner 써주는 게 낫나?
- 아니었음 그냥 고생함 ㅋㅋㅋㅋㅋㅋㅋ
 
-------------------------------------------------------------------------------------

메소드 오버라이딩


-메소드 이름, 메소드 인자 타입 및 개수, 리턴 타입이 다 동일해야함.

-그러니까 부모 클래스의 메소드를 자식이 재정의 하는거임


접근 지정자는 부모 클래스의 메소드의 접근지정자보다 좁아질 수 없다. (?)

출처: http://blog.eairship.kr/119


접근 지정자가 프라이빗 퍼블릭 프로텍티드 디폴트 이런거 있을 때

프로텍티드랑 퍼블릭이랑 디폴트만 접근 가능한데

접근 영역을 줄어들게 만들 수는 없음.


접근 많이 할 수 있는 순서: 퍼블릭>프로텍티드>디폴트


그러니까 부모가 프로텍티드면 자식이 퍼블릭으로는 못 만드는것


static이랑 private이랑 final은 오버라이딩 불가능 // static final이랑 private

//그럼 퍼블릭만 남는 것 아니쉼니까 ? -_-);;


return 타입 다른 경우 오류남!

이거 하면 부모 클래스의 메소드는 무시됨 - 자기가 정의한 걸 가져다 씀 (부모는 은닉됨) = 버전 업 개념


이게 다형성 구현의 핵심 원리인것


메신저 버전업한다고 안메신저 아닌것처럼 기능을 없애닌 게 아니라 기능 교체인것


------------------------코드---------------

package day08;




class OverA{

void show(String str){

System.out.println("상위클래스의 메소드 show(String str) 수행 " + str);

}

}


class SubOverA extends OverA{

void show(){

System.out.println("하위클래스의 메소드 show() 수행");

}

//메소드 인자 타입이 다르니까 오버라이딩 아님

//구냥 상속

//그리고 오버로딩일걸? 아마 값 주면 상위클래스 나옴

//이름이 같은 void 니까 맞음 - 근데 이렇게 해놓고

void show(String str){

System.out.println("나는 오버라이딩: " + str);

}

//이렇게 하면 메소드 이름이랑 인자 타입 및 개수가 같으니까 오버라이딩인것

//오버로딩: 같은 이름의 메소드를 여러개 가지면서

//매개변수의 유형과 개수가 다르도록 하는 기술

//오버라이딩: 상위 클래스가 가지고 있는 메소드를

//하위 클래스가 재정의 해서 사용하는것


//오버로딩은

//*하나의 클래스에서!!!!!!~@!!~!~!~!~!~!~!~!~!~ <- 꺙 'ㅅ'*

//함수명: 같음

//파라미터: 변수 타입 및 개수가 다름

//ㄴ 같은 경우에는 오버로딩이 아닌가?

//리턴 타입: 관계 없음

//사용: 같은 이름으로 함수 정의 

//*하나의 클래스에서!!!!!!~@!!~!~!~!~!~!~!~!~!~ <- 꺙 'ㅅ'*

//오버라이딩은

//*자식 클래스에서!!!!!!~@!!~!~!~!~!~!~!~!~!~ <- 꺙 'ㅅ'*

//함수명: 같음

//파라미터: 같음

//리턴 타입: 같음

//사용: 자식 클래스에서 부모 클래스의 함수 재정의 

//*자식 클래스에서!!!!!!~@!!~!~!~!~!~!~!~!~!~ <- 꺙 'ㅅ'*

}



public class OverrideExam1 {

public static void main(String[] args) {

SubOverA over = new SubOverA();

over.show("IT KOREA");

over.show();

}

}


-------------이제수정------------------

package day08;



//하나의 메소드만 추가하면 오버로딩 + 오버라이딩 되게...


class OverA{

void show(String str){

System.out.println("상위클래스의 메소드 show(String str) 수행 " + str);

}

}


class SubOverA extends OverA{

void show(){

System.out.println("나는 오버로딩  : 입력받는 것 없음");

}

void show(String str){

System.out.println("나는 오버라이딩: " + str);

}

void printShow(){

java.util.Scanner s = new java.util.Scanner(System.in);

show();

System.out.println("↓ 값을 입력하세요!");

show(s.nextLine());

}

}



public class OverrideExam1 {

public static void main(String[] args) {

SubOverA over = new SubOverA();

over.printShow();

}

}


------------------오버로딩이랑 오버라이딩 정리한 것 외울것! ------------------

--------------------------밥먹음맨-----------------------------

다형성 - Polymorphism

한 메소드가 오버라이딩 되면서 서로 다른 내용을 실행하게 되는것

부모의 메소드는 은닉된다! :D

Line a = new Line();
a.draw(); -------
//얘는 자식(Line)의 draw를 호출함
부모는 DObject

/*
다형성: 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미
예를 들어

키보드의 키를 사용하는 법: 누른다
근데 ESC랑 ENTER는 동작이 다름

그러니까 다형성이란 동일한 조작방법으로 동작시키지만 동작방법은 다른 것을 의미한다.

//출처: 구글링했는데 exit 눌러버려서 복사 못 함.

다형성: 여러 가지 형태를 가질 수 있는 능력
-에이씨 이게 제일 쉬움 ㅋㅋㅋㅋ

어쨌든 조상클래스의 메소드로 자손클래스의 메소드를 참조할 수 있도록 한 것

출처: http://arabiannight.tistory.com/entry/302
*/
-------------------------------------------------
부모 클래스 p = new 자식클래스(); <- 이게 업캐스팅인데 
이거 해봤자 자식 클래스한테 오버라이딩으로 메소드를 정의해놨으면 
메소드가 2개중 부모클래스의 메소드는 은닉되는거라서 동적 바인딩이 이루어져 자식클래스의 메소드를 실행한다.

동적바인딩: 부모의 메소드를 호출했지만 자식의 메소드가 실행되는 것

DObject p = new Line();
p.draw(); 
//얘네는 업캐스팅


---이거 수정했음----

package day08;

class Person {
String name;
String phone;
static int ID;

public void setName(String s) {
name = s;
}

public String getPhone() {
return phone;
}

public static int getID() {
return ID;
}

}

public class Professor extends Person {
// protected void setName(String s){ }
//부모의 접근 지정자보다 영역이 좁아졌다.
public void setName(String s) {
name = s;
}// 오버라이딩

public String getPhone() {
return phone;
}// 별 문제 없다.

// public void getPhone(){ }
// 오버라이딩인데 리턴 타입이 다르다.
// 오버라이딩의 조건
// 함수명이 같고(o)
// 파라미터가 같고(x)
// 리턴 타입이 같고(x)

public String getPhone(String s) {
return s;
}// 이러면 오버로딩

// public int getID(){ }
// static인데 오버라이딩 하려 했다.
// static은 오버라이딩 불가능 -> 부모를 static을 빼면 가능
}

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

객체 형변환

-상속 관계에서는 부모 자식간에 형변환 가능.

-상속 관계에서는 좌측에 부모클래스가 오고 - 우측에 자식클래스가 올 수 있다.

DObject p = new Line(); ---- 부모클래스 p = new 자식클래스();


그래도 실제로 메모리상에는 자식 객체를 생성하고 - 타입만 부모클래스라서 부모만 접근이 가능함 ㅇㅇ

오버라이딩 시에는 부모클래스 타입이더라도 자식클래스의 메소드가 호출됨.


1. 업캐스팅

2. 다운캐스팅이 있음


1. 업캐스팅

- 프로그램에서 이루어지는 자동 변환 타입

-(아까 위에거)

-서브 클래스의 레퍼런스 값을 슈퍼클래스 타입의 변수에 대입함 

class Person{

class Student extends Person{

}

Student s = new Student();

Person p = s; // 이렇게 자식 클래스의 레퍼런스 값을 부모 클래스의 변수에 대입하면 부모만 가리킴

}


-------예시에 super()때문에 공부하고 복붙-------------


package day08;


class Pers{

String name;

String id;

//default

public Pers(String name){

this.name = name;

}//생성자

}


class Stud extends Pers{

//String name;

//String id; //사용가능

String grade;

String department;

public Stud(String name){

super(name);//슈퍼가 뭐람

/*

* 

* http://neoroid.tistory.com/entry/Java-this-this-super-super-%EC%9D%98-%EC%9D%B4%ED%95%B4

* 

* this / this() 하고

* super / super() 하고

* 

* this.grade = "A"; 하면 

* 이 grade는 이 클래스의 멤버인 것을 나타냄

* 

* 근데 this()는 생성자를 호출하기 위해 사용함.

* 

* person jame = new person(23, "david", "america");

* person jame = new person(23, "david");

* 

* 이런 식으로 여러 종류 생성자가 있을 때 그냥

* 편하게 this(23, "david")처럼 입력해도 되나봄...

* 

* 이런 식으로 super();는 

* 현재 자식 클래스가 자신을 생성할 때

* 부모 클래스의 생성자를 불러서 한번 초기화 해주고 난 뒤

* 자신을 초기화하는 것임

* 

* ---요기까지 보다 말아씀 ------

* 

* */

}//생성자

}


public class UpCastingEx {

public static void main(String[] args) {

Pers p;

Stud s = new Stud("길동이");

p = s;

System.out.println(p.name);

// p.grade = "A"; //이거 p에는 없는 변수임

// p.department = "Com";//이것도 p에는 없는 멤버임

}

}


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


2. 다운캐스팅

업캐스팅 된 걸 도로 돌리는 거임

부모 클래스 레퍼런스를 자식 클래스 타입의 변수에 넣음


class Person{

}

class Student extends Person{

}

Student s = (Student)p;


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

이런 식으로

public static void main(String[] args) {

Pers p;

Stud s = new Stud("길동이");

p = s;

Stud s2 = (Stud)p;

//s2에다가 p에있는 해시코드를 대입


도로 s->p->s2 

다운 캐스팅 할때는 강제 형변환이 이루어지는것임 .


Stud s3 = new Pers(); //이거는 안됨   

왜냐면 이거는 Pers를 만들 때 Stud가 만들어지지 않으니까 

근데 Stud는 Pers도 만들어지니까 업캐스팅이 가능!


package day08;


class Pers{

String name;

String id;

//default

public Pers(String name){

this.name = name;

}//생성자

}


class Stud extends Pers{

//String name;

//String id; //사용가능

String grade;

String department;

public Stud(String name){

super(name);//슈퍼가 뭐람

/*

* 

* http://neoroid.tistory.com/entry/Java-this-this-super-super-%EC%9D%98-%EC%9D%B4%ED%95%B4

* 

* this / this() 하고

* super / super() 하고

* 

* this.grade = "A"; 하면 

* 이 grade는 이 클래스의 멤버인 것을 나타냄

* 

* 근데 this()는 생성자를 호출하기 위해 사용함.

* 

* person jame = new person(23, "david", "america");

* person jame = new person(23, "david");

* 

* 이런 식으로 여러 종류 생성자가 있을 때 그냥

* 편하게 this(23, "david")처럼 입력해도 되나봄...

* 

* 이런 식으로 super();는 

* 현재 자식 클래스가 자신을 생성할 때

* 부모 클래스의 생성자를 불러서 한번 초기화 해주고 난 뒤

* 자신을 초기화하는 것임

* 

* 부모 없이 자식이 존재하지 않으니까

* Stud를 만들려면 Pers를 만들어야 함

* 

* 만약에 Stud s = new Stud()라고 할 때

* 얘를 만들기 위해서는 

* 얘가 참조하는 Pers부터 만들어야함

* 

* 그러면 Pers의 생성자를 찾아간 뒤

* Stud를 만드는 것인데

* 

* 이럴 때 Pers의 생성자가 없으니까

* 디폴트값으로 public Pers()와 같이

* 생성자를 만듬.

* 

* Stud가 Pers를 상속하니까

* Pers를 만들어야 하는데

* Stud의 생성자에서

* 명시적으로 Pers의 생성자를 적어주지

* 않았으므로 기본값으로 

* super(); 를 부름.

* 

* 이거 뜻은 부모의 pers() (기본 생성자)

* 를 실행하라는 말임.

* 

* 그리고 super는 그냥

* 부모클래스의 필드값이나 메소드를 직접 부를 때 사용

* 

* 만약에 Stud나 Pers 둘 다 모두

* setAge(int) 메소드가 있을 때

* 자식 클래스인 Stud에서

* 부모 클래스인 Pers의 setAge(int); 메소드를

* 부를 일이 생겼을 때는

* 

* setAge(20); 하면

* Stud의 setAge 메소드를 부르게 되고

* 만약에 Stud에 setAge 메소드가 없으면

* Pers(부모 클래스)에 있는지 찾아보게 됨

* 

* 근데 상속된 거 말고 부모의 setAge()를 부르고 싶을 떄는

* super.setAge(); 하면 됨

* 

* 그러니까 super는 

* 나에게 있는 메소드나 필드를 찾지 말고

* 내 부모 클래스에 있는 필드나 메소드를 사용해라.

* 

* --그러니까 상위 클래스를 지칭하는 명령어-

* 

* super.변수; //부모 클래스의 변수를 호출한다.

* super(); //부모 클래스의 생성자를 호출한다.

* super(매개변수); //부모 클래스의 생성자(입력값)을 호출한다.

* super.메소드(); //부모 클래스의 메소드를 호출한다.

* super.메소드(매개변수); //부모 클래스의 메소드(입력값)을 호출한다.

* 

* */

}//생성자

}


public class UpCastingEx {

public static void main(String[] args) {

Pers p;

Stud s = new Stud("길동이");

p = s;

Stud s2 = (Stud)p;

//s2에다가 p에있는 해시코드를 대입

//Stud s3 = new Pers(); //이거는 안됨

//Pers 만든다고 Stud가 만들어지는게 아니니까

System.out.println(p.name);

// p.grade = "A"; //이거 p에는 없는 변수임

// p.department = "Com";//이것도 p에는 없는 멤버임

}

}


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

내가 다운캐스팅 시스템을 잘 이해하지 못했음

다운캐스팅: 업캐스팅 된 것을 다시 돌리는 것

아! ㅇㅋ



만약에 업캐스팅 안 된 걸 다운캐스팅 하면 어떻게 될까 - 짜보기

어 이거 Person s = new Student ("kim");

이걸로 해 볼 것 




객체 형변환 예제

package day08;


class TypeConvert{

String url = "http://www.kma.go.kr";

public void setUrl(String url){

this.url = url;

}

public String getUrl(){

return this.url;

}

}


public class TypeConvertTest {

public static void main(String[] args) {

TypeConvert tc = new TypeConvert();

Object obj = tc;

//업캐스팅하면

//객체 내에 있는 모든 멤버 접근은 불가능하고

//슈퍼클래스에 있는 멤버만 접근 가능.

//아! 그러니까 업캐스팅 해도 자기한테 있는 멤바만 접근 가능

//오브젝트 클래스의 메소드를 호출함 -_-);;

//System.out.println(obj.getUrl());

//obj 클래스에는 url이라는 스트링이 없음

System.out.println(tc.getUrl());

System.out.println(obj.hashCode());

System.out.println(tc.hashCode());

//아마 같게 나올 듯

//역시 같음

TypeConvert tc2 = (TypeConvert)obj;

System.out.println("tc2: " + tc2.getUrl());

System.out.println("tc2: " + tc2.hashCode());

}

}



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

동적바인딩 - 오버라이딩 + 업캐스팅 한 경우에 부모 객체에서 메소드 호출해도 자식 객체에 오버라이딩 된 메소드가 출력되는 것


source -> override / Implements Methods 해서 부모 것 오버라이딩 할 수 있는 메소드 생성 가능


그러면 toString을 

package day08;


class TypeConvert{

String url = "http://www.kma.go.kr";

public void setUrl(String url){

this.url = url;

}

public String getUrl(){

return this.url;

}


@Override

public String toString() {

// TODO Auto-generated method stub

return "TypeConvert의 Override된 toString()";

}

}


public class TypeConvertTest {

public static void main(String[] args) {

TypeConvert tc = new TypeConvert();

Object obj = tc;

//업캐스팅하면

//객체 내에 있는 모든 멤버 접근은 불가능하고

//슈퍼클래스에 있는 멤버만 접근 가능.

//아! 그러니까 업캐스팅 해도 자기한테 있는 멤바만 접근 가능

//오브젝트 클래스의 메소드를 호출함 -_-);;

//System.out.println(obj.getUrl());

//obj 클래스에는 url이라는 스트링이 없음

System.out.println(tc.getUrl());

System.out.println(obj.hashCode());

System.out.println(obj.toString());

System.out.println(tc.hashCode());

//아마 같게 나올 듯

//역시 같음

TypeConvert tc2 = (TypeConvert)obj;

System.out.println("tc2: " + tc2.getUrl());

System.out.println("tc2: " + tc2.hashCode());

}

}


부모를 가리키는 해시코드값을 가지고 있어도 자식의 메소드를 출력함
이유: 호출할라 그랬더니 없어서 -> 찾으니까 -> 자식한테옴

이게 동적바인딩


상속 머리가 아프닼ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

package day08;
//수당 주는 기능까지 추가되는 걸 상속으로 만듭시다 :D

//allowance

class Pay2 {
java.util.Scanner s = new java.util.Scanner(System.in);

private String name;
private int bonbong;

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

public String getName() {
return name;
}

public void setBonbong(int bonbong) {
this.bonbong = bonbong;
}

public int getBonbong() {
return bonbong;
}

public Pay2() {

}

public Pay2(String name, int bonbong) {
this.name = name;
this.bonbong = bonbong;
}

public int taxCalc() {

return (int) (bonbong * 0.045 + 0.5);
}

public int silsuCalc() {

return bonbong - taxCalc();
}

public void payPrint() {
System.out.println("이름: " + name);
System.out.println("본봉: " + bonbong);
System.out.println("세금: " + taxCalc());
System.out.println("수령: " + silsuCalc());
System.out.println("");
}

}

class Allowance extends Pay2{
private int year = 5;
private int child = 0;
Allowance(){
}
Allowance(int year, int child, String name, int bonbong){
//부모의 생성자 호출
super(name, bonbong); //이름과 본봉을 받는 생성자가 있으니까 가능
this.year = year;
this.child = child;
}
public void setYear(int year){
this.year = year;
}
public int getYear(){
return year;
}
public void setChild(int child){
this.child = child;
}
public int getChild(){
return child;
}
public int allowanceCalc(){
int allowance = 0;
if(year == 0){
System.out.println("신입사원입니다.");
}
else if(year == 1){
allowance = 200000;
System.out.println("경력 1년입니다.");
}else if(year == 2){
allowance = 400000;
System.out.println("경력 2년입니다.");
}else if(year == 3){
allowance = 600000;
System.out.println("경력 3년입니다.");
}else if(year == 4){
allowance = 800000;
System.out.println("경력 4년입니다.");
}
else{
allowance = 1500000;
}
if(year>=1){
if(child>=1){
allowance = allowance + (child*200000);
}
}
return allowance;
}

@Override
public void payPrint() {
System.out.println("이름: " + getName());
System.out.println("본봉: " + getBonbong());
System.out.println("세금: " + taxCalc());
System.out.println("수령: " + silsuCalc());
System.out.println("");
}


public int silsuCalc() {

return getBonbong() - taxCalc() + allowanceCalc();
}


}

public class PayCalc {

public static void main(String[] args) {
Pay2 p1 = new Pay2();
Pay2 p2 = new Pay2();
Pay2 p3 = new Pay2();
Pay2 p4 = new Pay2("홍길동",3000000);
Allowance p5 = new Allowance(4, 3, "길동이", 3000000);
Allowance p6 = new Allowance();
p6.setBonbong(3500000);
p6.setName("길동삼");
p6.setChild(10);
p6.setYear(5);
p1.setName("왕눈이");
p1.setBonbong(2000000);
p1.payPrint();
p2.setName("아로미");
p2.setBonbong(3000000);
p2.payPrint();
p3.setName("투투");
p3.setBonbong(5000000);
p3.payPrint();
p4.payPrint();
p5.payPrint();
p6.payPrint();
}

}


예전에 했던 예제로 상속 테스트하는 것




Dave's not here man


--------------------이거 넘 스트레스 받아서 소스 받음 -------------


package test.day03;


public class SwitchTest2 {


  public static void main(String[] args) {

    System.out.println("점수         " + "출력내용");

    System.out.println("=================");

    int score = 100 ; 

    int s = (score/10);

    

    switch(s){

    case 10:

      System.out.println("");

      break;

    case 9:

      System.out.println("등급은 A입니다.");

      break;

    case 8:

      System.out.println("등급은 B입니다.");

      break;

    case 7:

      System.out.println("등급은 C입니다.");

      break;

    case 6:

      System.out.println("등급은 D입니다.");

      break;

    default:      

      System.out.println("노력하세요");

      

    }

  }


}



스위치문 넘나 좋은것-------------------------------------

저거 받아서 이거 짰음.

package day08;

class Score {
private String name; // 이름
private int kor; // 국어
private int eng; // 영어
private int mat; // 수학

public Score() {

}

public Score(String name, int kor, int eng, int mat) {
this.name = name;
this.kor = kor;
this.mat = mat;
}

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

public String getName() {
return name;
}

public void setKor(int kor) {
this.kor = kor;
}

public int getKor() {
return kor;
}

public void setEng(int eng) {
this.eng = eng;
}

public int getEng() {
return eng;
}

public void setMat(int mat) {
this.mat = mat;
}

public int getMat() {
return mat;
}

public int totalCalc() {
return getKor() + getEng() + getMat();
}

public double avgCalc() {
return totalCalc() / 3;
}

public void printScore() {
System.out.println("이름: " + name);
System.out.println("총점: " + totalCalc());
System.out.println("평균: " + avgCalc());
System.out.println("");
}
}

class ScoreGrade extends Score {

ScoreGrade() {

}

ScoreGrade(String name, int kor, int mat, int eng) {
super(name, kor, mat, eng);
}

public void gradeCalc(int num) {
int s = (num / 10);

switch (s) {
case 10:
System.out.println("");
break;
case 9:
System.out.println("등급: A입니다.");
break;
case 8:
System.out.println("등급: B입니다.");
break;
case 7:
System.out.println("등급: C입니다.");
break;
case 6:
System.out.println("등급: D입니다.");
break;
default:
System.out.println("노력하세요");

}
}

public void printScore() {
System.out.println("이름: " + getName());
System.out.println("총점: " + totalCalc());
System.out.println("평균: " + avgCalc());
gradeCalc((int) (avgCalc()));
System.out.println("");
}
}

public class ScoreCalc {
public static void main(String[] args) {

Score human1 = new Score();
Score human2 = new Score("길동이", 100, 200, 300);
ScoreGrade human3 = new ScoreGrade("길동삼", 50, 60, 70);
ScoreGrade human4 = new ScoreGrade();

human1.setName("길동일");
human1.setKor(100);
human1.setEng(90);
human1.setMat(80);

human4.setName("길동사");
human4.setEng(80);
human4.setMat(100);
human4.setKor(100);

human1.printScore();
human2.printScore();
human3.printScore();
human4.printScore();

}
}

저거 소스 가져다가 스캐너로 입력받을 수 있게 고쳐보는것

아니 오버라이딩은 괜찮은데
업캐스팅 다운캐스팅 스트레스 받는것



5. 수업

진도: 

hw: 


6. 할것


치즐 - 악기 튜닝 가능한 공방

아크릴 물감

'Programming' 카테고리의 다른 글

160325: 10회차  (0) 2016.03.25
160324: 9회차  (2) 2016.03.24
160322: 7회차  (4) 2016.03.22
160321: 6회차  (1) 2016.03.21
160318: 5일차  (2) 2016.03.18
Posted by DAVID

160322: 7회차

Programming 2016. 3. 22. 16:29

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


Setter랑 Getter 쓰는 이유는

http://devist.tistory.com/128

http://dynamide.tistory.com/1384

에서 참조


class 사람{

int 키 = 170;

int 몸무게 = 60; 

}


이라는 클래스를 만들게 될 경우

사람.키와 사람.몸무게로 직접적으로 접근이 가능한데 그러면

아무나 접근을 해서 변경이 가능하기 때문에


클래스의 멤버 필드에는 클래스에서만 접근해서 수정이 가능한 private로 선언을 한다.


그러면

class 사람{

private int 키 = 170;

private int 몸무게 = 60ㅣ

}

이 되는데 이러면 객체에서 키랑 몸무게를 못 바꾸니까

멤버 필드 변수를 변경해주는 기능을 제공해 주는 게 setter와 getter이다.


class 사람{

private int 키 = 170;

private int 몸무게 =60;


public void set 키(int a){

키 = a;

}


public int get키(){

return 키;

}

}


이렇게 하면 get키가 getter고 set키가 setter가 되는데

이러면 키값 변경시


사람 people = new 사람();

people.set키(180);

이런 식으로 객체 값을 변경하고


System.out.println(people.get키());

이런 식으로 객체값을 가져올 수 있다.


이게 좀 불편한데 나중에 프로그램이 커지면 변수에 직접 접근시 오류가 생겼을 경우 발견하기 어려운 걸 방지하기 위해서라고 한다.


그리고 이런 거 이름이 캡슐화.

이거 eclipse에서 Source -> Generate Getters and Setters 하고 변수 체크한 뒤 확인 누르면 만들어지긴 하는데

연습하는 거니까...


그리고 변수명이 name이면

setName 같은 모양으로 만들어주는게 암묵적인 규칙이래...


그리고 한 메소드에 세터 한번에 넣어주는 건 안되는 것 - 따로 쓰라고 쪼개놓은 것...



//잊어버릴까봐: static이 붙은 메소드나 변수는 데이터 영역에 메모리가 할당되는데

이렇게 하면 객체 생성할 필요 없이 클래스를 통해 바로 변수에 접근이 가능하다.


String은 기본형 타입이 아닌데 기본형 같이 생김...

그리고 call by reference임


문자열 타입은 String StringBuffer StringBuilder가 있는데 String만 불변의 특징이 있다.


이게 한번 정한 글자는 바꿀 수가 없는건데

"마우스" -> "마우스다"로 바꾸고 싶으면

그냥 넣어주면 바꾼 것처럼 보이지만


사실 메모리를 새로 잡은거임

그냥 "마우스" +"다" 를 할 수 없고 "마우스" 를 가리키는 해시코드를 "마우스다"를 가리키는 해시코드로 바꿔준거임

그리고 이게 기본형 변수 타입이 아닌 클래스인데도


String name = new String() 이렇게 안 쓰고 String name = "길동이" 이렇게 쓰면 객체화 완료.


그런데 StringBuffer는 StringBuffer sb = new StringBuffer("홍길동") 한 다음에 

StringBuffer sb2 = new StringBuffer("홍길동") 이라고 만들면 sb와 sb2가 서로 다른 해시코드값을 가지는데


String은 String name = "홍길동" 과 String name2 = "홍길동"이 가리키는 해시코드값이 동일하다.

(메모리상으로 하나인 것)


어쨌든 만약에 문자열이 계속 변경되는 프로그램이면 스트링버퍼를 써야지 스트링을 쓰면 메모리 낭비가 심하다.




그리고 문자열 비교할 때는 == 쓰지말고 equals를 쓰자

public static void main(String[] args) {

String n1 = "yes";

String n2 = "yes";

System.out.println(((n1==n2) ? n1 : n2));

}

이게 메모리상으로 String은 해시코드값이 동일해서 yes로 나오긴 하는데 equals를 권장한다니까


public static void main(String[] args) {

String n1 = "yes";

String n2 = "yes"; // String n2 = "nop";

System.out.println((n1.equals(n2) ? n1 : n2));

}

그냥 권장하는 대로 이렇게 쓰자.



그리고 대문자랑 소문자 바꿀 수도 있음

public static void main(String[] args) {

String n1 = "yes";

String n2 = "YES";

System.out.println(n1.toUpperCase());

System.out.println(n2.toLowerCase());

}

이렇게 toUpperCase하고 toLowerCase 메소드 쓰면 됨.


-생성자는 곧 제대로 배울 것 같지만 -

이렇게 생김

class Test{

Test(){

} //얘가 생성자

}


배열 정의할 때

Goods goodsArray[] = new Goods[3];

이거는

Goods goodsArray[];

goodsArray = new Goods[3]; 하고 같음


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

이건 문자열 대체하는 코드


static void replaceSpace(char a[]) {

for (int i = 0; i < a.length; i++) {

if (a[i] == ' ') {

a[i] = ',';

}

}// 공백을 발견하면 ,로 바꿔준다.

}


static void printCharArray(char a[]){

for(int i = 0; i<a.length; i++){

System.out.print(a[i]);

}

System.out.println(); //이건 그냥 출력용

}

public static void main(String[] args) {

char c[] = {'T','h','i','s',' ','i','s',' ','a',' ','p','e','n','c','i','l','.'};

printCharArray(c);

replaceSpace(c);

printCharArray(c);

}



---------------------------------------------------코딩타임이길래 복습하는 것 ------------------------------------------

[12] 메소드 오버로딩 + 생성자


예~ 생성자~~


같은 클래스 내에서 이름이 같은 메소드를 여러 개 만드는 것.

이름이 같아도 인자값으로 받는 개수나 타입이 다르면 다른 메소드로 JVM이 인식하기 때문에 가능한 일


예를 들어 println 같은 것도

System.out.println(1);

System.out.println(1.5);

System.out.println("우리는 한국인");

System.out.println(a);


이렇게 메소드 오버로딩 식으로 선언되어져 있음.


근데 return 타입은 메소드를 구분하는 조건으로 사용 x - 받는 값만 인정


이름이 다르면 메소드 오버로딩이 아님


public void prinnta(int x){}

public void prinnta(float x){}

public void prinnta(String x){}


저런 식으로 만들면 되는데 


PrintStream 클래스 애들이 메소드 오버로딩의 예에 많음


http://docs.oracle.com/javase/8/docs/api/

PrintStream docs에서 보면 out이 printStream 타입 변수로 선언되어져 있다.


println()메소드 및 생성자는 대표적인 메소드 오버로딩.

-그러므로 생성자도 여러 개 만들 수 있는 것


메소드의 인자의 개수나 타입이 달라야 한다.


인자나 개수나 타입이 같고 리턴 타입만 다르면 컴파일 오류


------2교시 코딩해놓고 졸았음 - 메소드 오버로딩-----

어쨌든 이름을 같게 해놓고 파라미터를 다르게 주면 다른 메소드인것


package day07;


public class AvgTest {

public int getAvg(){

System.out.println("값을 2개이상 입력해 주세요.");

return 0;

}

public int getAvg(int a, int b){

return (a+b)/2;

}

public int getAvg(float a, float b){

return ((int)a+(int)b)/2;

}

public int getAvg(int a, int b, int c){

return (a+b+c)/3;

}

public int getAvg(int a, int b, int c , int d){

return (a+b+c+d)/4;

}

// public float getAvg(){

// return 0.0f;

// }


public static void main(String[] args) {

                                       

AvgTest st = new AvgTest();

System.out.println(st.getAvg());

System.out.println(st.getAvg(10,20));

System.out.println(st.getAvg(10.5f,20.5f));

System.out.println(st.getAvg(10,20,30));

System.out.println(st.getAvg(10,20,30,40));

}


}



이런 경우에

// public int getAvg(int a, int b){
// return (a+b)/2;
// }

요렇게 하고

System.out.println(st.getAvg(10,20)); 
이렇게 하면 제일 비슷한 float 2개 들어간 getAvg로 계산함



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

생성자
1. 리턴형이 없음
2. 클래스명과 같아야함( 대소문자 구별함)
3. new를 이용해서 객체 할당 후 초기화함 ★★
4. 생성자를 안 만들어주면 기본생성자를 자동으로 만들어줌 ★★
기본생성자: 매개변수에 아무것도 없는 것 - 그냥 ()만 있는 것


이거 한번 더 보기... - 졸았음

package day07;

class School2{
int kuk = 0;
int eng = 0;
int tot = 0;
public int hap(){
tot = kuk=eng;
return tot;
}
}

public class SchoolMain2 {
public static void main(String[] args) {
School2 sc2 = new School2();
sc2.kuk = 90;
sc2.eng = 100;
System.out.println("hap:" + sc2.hap() );
}
}


생성자를 아예 호출을 안 하면 자동으로 JVM이 만들어줌.

package day07;

class School3 {
int kuk;
int eng;
int tot;

public School3() {

}

public int hap() {
tot = kuk + eng;
return tot;

}

}

public class SchoolMain3 {
public static void main(String[] args) {
School3 sc3 = new School3();
sc3.kuk =90;
sc3.eng = 100;
System.out.println("hap:" + sc3.hap());
}
}

기본 생성자에 파라미터값이 없어도 그냥 만들어놓는 것이 낫다.

package day07;

class School4 {
int kuk;
int eng;
int tot;

public void setKuk(int kuk) {
this.kuk = kuk;
}

public void setEng(int eng) {
this.eng = eng;
}

public void setTot() {
tot = kuk + eng;
}

public int getKuk() {
return kuk;
}

public int getEng() {
return eng;
}

public int getTot() {

return tot;
}

public School4() {
}

public School4(int kuk, int eng) {
this.setKuk(kuk);
this.setEng(eng);
}

}

public class SchoolMain4 {
public static void main(String[] args) {
School4 sc4 = new School4();
sc4.setEng(90);
sc4.setKuk(100);
sc4.setTot();

System.out.println("hap: " + sc4.getTot());

School4 sc = new School4(90, 100);
sc.setTot();

System.out.println("hap2: " + sc.getTot());
}
}00

만약에public School4(int kuk, int eng) {}는 있는데 Schoo4(){}가 없으면 오류가 난다.
그러니까

1. 생성자를 아예 안 만들던가(자동으로 만들어줌)
2. 변수 넣는 생성자를 만들면 기본 생성자(클래스명(){} ) <- 를 꼭 만들어준다.
3. 사실 그냥 안써도 만들어주는게 낫다 <-

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

Static 변수 = 정적 변수 = 클래스 변수 , Static method = 클래스 메소드

- Static을 사용하면 객체를 만들지 않고 변수나 메소드의 사용이 가능하다.
보통 간단한 값의 처리시 주로 이용한다
new를 이용하여 메모리를 할당해서 쓰지만 static 요소들은 클래스가 JVM에 인식될 때 자동으로 메모리가 할당된다.

데이터 영역에 위치해있음.

  public class StaticTest{
         public static int b = 0; <- 최초 1회만 메모리 할당을 받고 모든 객체들이 공유함

         private int a = 0;       <-- 인스턴스 변수
     }    

     public class Test{
          .....
         StaticTest s1 = new StaticTest();
         StaticTest s2 = new StaticTest();
         .....

      }
 

저런 식으로 그냥 만들면 DATA 영역에 만들어진다.

package day07;

class ScjpPass{
int t1;
int t2;
int t3;
int t4;
static int BONUS = 100; //클래식 변수 정적 변수 스태틱 변수
public int getT1() {
return t1;
}

public void setT1(int t1) {
this.t1 = t1;
}

public int getT2() {
return t2;
}

public void setT2(int t2) {
this.t2 = t2;
}

public int getT3() {
return t3;
}

public void setT3(int t3) {
this.t3 = t3;
}

public int getT4() {
return t4;
}

public void setT4(int t4) {
this.t4 = t4;
}

public static int getBONUS() {
return BONUS;
}

public static void setBONUS(int bONUS) {
BONUS = bONUS;
}

public ScjpPass(){
}
public ScjpPass(int t1, int t2, int t3, int t4){
this.t1 = t1;
this.t2 = t2;
this.t3 = t3;
this.t4 = t4;
}
}


public class Scjp {
public static void main(String args []){
System.out.println("스태틱변수: " +ScjpPass.BONUS);
// ScjpPass.BONUS++;
ScjpPass.setBONUS(112);
ScjpPass sp = new ScjpPass(85,90,80,70);
System.out.println("sp.t1: " + sp.t1);
System.out.println("sp.BONUS: " + sp.BONUS);
}
}

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

스태틱 메소드는 객체를 만들지 않고도 호출할 수 있다.
package day07;

class SCWCD{

int t1,t2,t3,t4;
static int BONUS = 100;
public int getT1() {
return t1;
}

public void setT1(int t1) {
this.t1 = t1;
}

public int getT2() {
return t2;
}

public void setT2(int t2) {
this.t2 = t2;
}

public int getT3() {
return t3;
}

public void setT3(int t3) {
this.t3 = t3;
}

public int getT4() {
return t4;
}

public void setT4(int t4) {
this.t4 = t4;
}

public static int getBONUS() {
return BONUS;
}

public static void setBONUS(int bONUS) {
BONUS = bONUS;
}

public SCWCD(){}
public SCWCD(int t1, int t2, int t3, int t4){
this.t1 = t1;
this.t2 = t2;
this.t3 = t3;
this.t4 = t4;
}
public static void prLine(){
System.out.println("***************");
System.out.println("    SOLDESK    ");
System.out.println("       JAVA    ");
System.out.println("***************");
}
}

public class SCWCDmain {
public static void main(String[] args) {
//클래스.static메소드명();
SCWCD.prLine();
}
}

이런 식으로 그냥 클래스명으로 호출 가능하다.
-----------------------------------------------

객체를 생성하면 멤버변수 같은 건 그냥 기본 지정된 값으로 초기화되는데
static변수는 처음에 한번 특정값으로 초기화되고 끝임.
그리고 나서 값을 변경해주면 증가나 감소가 된다.

또 객체를 여러개 생성해도 한번만 생성이 된다.
- 멤버 메소드에 static 변수를 선언할 수 없다.

package day07;

class Box {
int cnt = 0;
static long boxID = 0;
static int count = 0;
//자주 쓰는 것만 static 

public Box() {
boxID = boxID + 1;
cnt = cnt + 1;
System.out.println("멤버 변수 cnt: " + cnt);
System.out.println("static 변수 BoxID: " + boxID);
}


// // 멤버 메소드에서는 static 변수를 선언할 수 없습니다.
// public void staticTest() {
// static long count = 0;
// //static이 들어가서 data영역으로 가야하는데
// //지역변수라서 stack에 가야함 -_-);;
// //근데 메인문 전에 static변수 할당이 끝나야되어서
// //static 사용 불가능
// count = count + 1;
// }

//static 메소드에 static 변수를 선언할 수 없습니다.
public static void staticTest2(){
//static이든지 말든지 메소드 안에서는 
//변수 만들면 무조건 stack영역임
static int count = count+1;
System.out.println("count: " + count);
}

}
public class StaticDemo {
public static void main(String[] args) {
Box.staticTest2();
Box.staticTest2();
Box.staticTest2();
Box.staticTest2();
Box mybox1 = new Box();
// Box mybox2 = new Box();
// Box mybox3 = new Box();
mybox1.staticTest2();
}
}



어쨌든 static은 사용할 때만 사용해야 함... 메모리 낭비인것


static: 생성 없이 클래스 영역 안에 속한 static이란 메모리 영역안에 오직 하나만 생성되서,

여러 인스턴스가 동시에 공유할 수 있도록 되어있는 것


그래서 클래스당 하나고, 정적으로 먼저 생성된 것들 - data영역


가능한 static 종류는  - 정적 멤버 변수, 정적 메소드, 정적 내부 클래스


이걸로 다 만들면 setter getter 안써서 짱 편한데 안 쓰는 이유는 

1. 메모리 부족

2. 그리고 *로 import하면 정적 자원이 메모리에 과다하게 들어가니까 *로 import 하지 말 것 - Integer같은거...


--------------날라가고 다시 ---------------------


package day07;


class Final {


int money = 10000;


final int day = 7;

final int week = 4;


// 객체를 만들지 않아도 사용할 수 있습니다.

// final static 변수

final static int month = 12; // 1년 // = final과 static 두개의 특징을 다 가진 것


public Final() {

}


}


public class FinalMain {

public static void main(String[] args) {

Final fi = new Final();

fi.money = 15000;


// final 변수는 값을 변경(대입)할 수 없습니다.

// fi.day = 10;

System.out.println("1주일 용돈: " + fi.money * fi.day);

System.out.println("1년: " + Final.month + "달");

// Final.month = 20000;

}

}


이거 Final.month하고 fi.month 하고 같은 애임 - 스태틱이라서

---------이게 여기까지임 ----------------------------
http://www.lectureblue.pe.kr/reqtiles/read.jsp?bbsno=13&nowPage=1&col=&word=&code=1
13회차까지

이거 메모리 어디에 위치하는 지 써보기...:>
------------------------------위에 날아간 거 다시 적기-------------12회차~13회차 다 날아감 ㅠㅅㅠ...

Access Modifier - 접근 한정자 = 제한자 = 수정자

public으로 변수를 만들면 - 아무데서나 접근 가능 (남의 클래스에서도)
private 로 변수를 만들면 - 처리 기능을 메소드로 구현해서 캡슐화 o

클래스간에 멤버 변수나 멤버 메소드에 접근하는 것을 제한함.
클래스간에 간섭을 줄이기 위해 적용함.

클래스간에 간섭을 막을 수 있음으로 콤포넌트의 독립성을 강화할 수 있다 
ㄴ 만약에 각각 컴포넌트 간 연관성이 있으면 작은 부분만 필요할 때 큰 게 줄줄 딸려온다거나 해서 유지보수나 코드 수정이 용이하지 않음.

----------------------------------------------------------------------------------------- 
접근 제한자   같은 클래스    같은 패키지    상속관계의 다른 패키지    관련없는 다른 패키지 
                             (같은 폴더)        (폴더 상관없음)          (다른 폴더)   
------------ ----------------------------------------------------------------------------- 
private          ○               X                 X                       X  (중요) 
----------------------------------------------------------------------------------------- 
friendly         ○               ○                X                       X 
----------------------------------------------------------------------------------------- 
protected        ○               ○                ○                      X   
------------------------------------------------------------------------------------------ 
public           ○               ○                ○                     ○ (중요) 
------------------------------------------------------------------------------------------ 

private - 같은 클래스만 접근 가능
friendly = default = 아무것도 없는거  - 같은 클래스, 패키지까진 접근 가능
protected - 같은 클래스, 패키지, 상속관계에 있는 다른 패키지까진 접근 가능
public - 다가능...

private - 이랑
public -  을 잘 쓴대... :>

package day07;

class Data {
private String name = null;
private String season = null;
private int year = 0;

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

public void setSeason(String season) {
this.season = season;
}

public void setYear(int year) {
if (year >= 20 && year <= 30) {
this.year = year;
} else {
System.out.println("입력될 수 있는 나이 20~30세 사이입니다.");
}
}
public String getName(){
return name;
}
public String getSeason(){
return season;
}
public int getYear(){
return year;
}

}

public class DataAccess {
public static void main(String[] args) {
Data d = new Data();
// d.name = "왕눈이";
// System.out.println(d.name);
// d.name("왕눈이"); <-이거는 private 쓰면 접근 불가
d.setName("왕눈이");
d.setSeason("늦가을");
d.setYear(35);

System.out.println(d.getName());
System.out.println(d.getSeason());
System.out.println(d.getYear());
}
}

------------------------------------------
private는 외부에서 호출될 수 없음.
package day07;

class PrivateTest {
public int kuk = 0;
public int eng = 0;
public int sum = 0;

private void sum() {
sum = kuk + eng;
if (sum > 200) {
System.out.println("점수가 200을 초과했습니다.");
sum = 0;
} else {
System.out.println("합계가 정상적으로 처리?습니다.");
}
}

// Deligate Method - 직접 접근 못하니까 대리자...
//이런 경우 별로 많지 않은 것
public void call_sum() {
sum();
}
}

public class PrivateTestMain {
public static void main(String[] args) {
PrivateTest pt = new PrivateTest();
pt.kuk = 90;
pt.eng = 95;

// pt.sum(); //외부에서 호출할 수 없습니다.
pt.call_sum();
System.out.println("pt.sum(): " + pt.sum);
}
}


------------------------------마지막시간---------------------------
Garbage Collecting 

1. 멤버변수와 객체에 할당된 메모리를 회수한다.
2. JVM이 자동으로 수행한다.
3. 멤버 메소드등 일반 메소드안에서 생성된 객체가 메소드의 지역변수에서 참조 할 때 - 메소드 종료시 자동으로 메모리 회수!

null값을 가지고 있는 객체변수가 있을 때 걔가 참조했던 객체는 회수의 대상
그리고 이거 별로 순위가 안 높아서 다른 애들 다 끝나면 수행

gc()를 실행하면 강제로 메모리 회수 작업을 하게 되는데 - finalize()메소드호출
이거 근데 별로 안 쓰는 편이 좋은 거래 왜냐면 잘못하면 과부하걸림...

생성자 - 만약에 내가 안 쓰면 자동으로 호출됨
소멸자 - finalize() - 자동 호출 되지 않음  = 폴백 (fallback) 메소드  -굳이 강제로 안 해도 될거 같은 느낌


해시코드값 같은 것 머리가 아픈것

힙에서의 삶과 힙에서의 삶과 죽음 넘나 철학적인것 -_-);;
그러니까 그냥 객체 위치를 가리키는 해시코드값이 사라질 시기 같은 거임... 

참조하는 애 없으면 gc가 할 일 없을때 가서 finalize()호출해서 없애줌 

//가비지 컬렉터 소스 안 쳐봤음 - 쳐보기

 >>>>> GarbageTest.java 

class Garbage { 
     
    int objNo; 
     
    public Garbage(int n) { 
        objNo = n; 
        System.out.println("Garbage class " + objNo + " 이 만들어 졌습니다."); 
    } 

    //객체의 메모리가 회수 될때에 자동으로 호출됩니다. 
    protected void finalize() throws Throwable { 
        System.out.println("Garbage class " + objNo + " 에서 쓰이던 메모리가 수집되었습니다."); 
        super.finalize(); 
    } 
} 

public class GarbageTest { 

    public static void main(String[] args) { 

        Garbage[] ga = new Garbage[10]; 
         
        //객체 생성 
        for (int i=0; i < ga.length; i++) { 
            ga[i] = new Garbage(i); 
        } 

        //객체 메모리 해제  
        for (int i=0; i < ga.length; i++) { 
            ga[i] = null;//메모리 회수의 대상이 됩니다. 
        } 

        //강제로 가베지컬렉션 기능 수행  
        System.gc(); 
    } 
} 





5. 수업

진도: 

hw: 


6. 할것


소스코드 메모리 영역 적어보기.


DecimalFormat 외울 것 - 집에 가기 전에 한번 짜 볼 것.


package day07;


import java.text.DecimalFormat;


public class TestDecimalFormat {

public static void main(String[] args) {

double testnum;

DecimalFormat d = new DecimalFormat(".###");

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.println("입력하세요: ");

testnum = s.nextDouble();

System.out.println(d.format(testnum));

}

}


짰음.


Studydesk 인강 볼 것. 


ocjp - 할인중 (6월까지 신청할 것)

http://itandgame.tistory.com/128

여기 덤프 있음

'Programming' 카테고리의 다른 글

160324: 9회차  (2) 2016.03.24
160323: 8회차  (1) 2016.03.23
160321: 6회차  (1) 2016.03.21
160318: 5일차  (2) 2016.03.18
160317: 4회차  (3) 2016.03.17
Posted by DAVID

160321: 6회차

Programming 2016. 3. 21. 13:21

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것

아침엔 클래스랑 객체 리뷰


<<메모리친구>>

힙: 객체 + 배열 - 얘네는 멤버변수 크기만큼 잡음(메모리 낭비 심한것)

스택:: 지역변수 - 부르면 챱챱

코드: 메소드

데이터: 얜 나중에 :>


클래스: 객체 정의 + 객체의 모임    -붕어빵틀    -은행계좌(발급용)

객체: 얘가 실체임 ㅇㅇ = 인스턴스    -붕어빵    -ㅁㅁ의계좌


빵먹고싶당


Class 만들 때 메소드처럼 클래스명() 이렇게 만들면 안됨... 자꾸 헷갈리는것


클래스(파라미터 = 매개변수 = 인자)

파라미터는 데이터 호출용인데 this.인자 = 값 하면 접근 가능함.


객체는 서로 독립적인 형태로 사용하쉬는것


객체 생성할 떄는 new를 쓴다 = 메모리 할당 용도.


메소드를 기본형 인자로 생성을 하면 return 없으면 안돌아감...

void는 리턴값 없어도 되어서 괜찮음.


메소드안에서 자기네 클래스 다른 메소드 호출 가능 - ㅇㅇ


메소드는 많이 만들어도 성능 저하는 없음.

멤버 변수는 많이 만들면 성능 저하가 있는것 ㅠㅠ


자바는 포인터가 없어서 그...그거는 불가능 (-_-);;; - 그거 ... ㅇ...



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


객체:


상속

다형성

캡슐화 - 세터 & 게터 사용해서 접근 하는 것 - 안에 있는 성분은 모르는데 사용하는 법은 아는것 ((ex) 감기약 같은)


- 캡슐화:

 private로 멤버변수를 선언하면 그 클래스 내에서밖에 접근을 못함 

- 예를 들어 main이 있는 클래스에서 private로 선언된 남의 클래스 변수를 직접 못 접근하니까

setter랑 getter (값을 저장하고 / 가져오고) 를 꼭 선언해줘야 한다.


이게 메소드 이름이 setter가 아니라 그냥 기능적인 요소 


private String name;

private int bonbong;

public void setName(String name){

}


요러면 위에 지역변수 name은 힙 영역

밑에 파라미터는 스택영역에 메모리를 잡아서 이름이 같아도 되긴 하는데

이름이 같을 경우

public void setName(String name){

name = name;

}

요렇게 하면 어느 name인지 모르니까 // 사실 자기가 속한 지역변수가 우선이라서 저건 파라미터 = 파라미터 라는 식임 

this.name = name; 으로 고치면

this.name은 위에 지역변수고

name은 파라미터인것.


public void setName(String name){

this.name = name;

}

어쨌든 이게 세터


public String getName(){

return name;

}

이게 게터.


근데 지역변수랑 파라미터랑 이름이 같지 않으면 this 안 써줘도 됨...


세터랑 게터를 하나하나씩 다 만들어 줘야 하는군

안써도 게터를 만들어 줘야 함



2교시때까지 저번 주 코드를 setter getter로 고치는 거 하고있음.



식별자 이름  setName 같이 set 다음에 대문자 한번 써줄 것.

오류는 안 나는데 나중에 프로젝트 하거나 다른 사람과 협업 할 시 귀찮아지니까...

-> 이뿌게 쓸것


이런 이클립스에서 이거 자동 생성할 수 있는 거였음 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

으아아 그래도 코딩 연습을 잘 했슴니다 :<


아니 그냥 세터 게터를 하나씩 만들어주고 세터를 호출해주는 메소드를 만들면 되겠군...? 귀찮음맨인것 ...

ㄴ 이건 생성자를 통해서 한번에 박을수가 있어서 필요없는것... 그러니까 저것은 따로 쓰려고 만든 애입니다

이런것도 되나


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


멤버 메소드

main은 멤버 메소드가 아님

근데 메인 말고는 다 멤버 메소드라고 생각하면 그것도 아니긴한데 일단 ... 내가 만든 건 다 멤버 메소드임.


메소드네 인스 데이터 타입은 리턴값과 일치해야함 

그리고 파라미터랑 호출시 데이터 타입도 일치해야함 - 그러니까 데이터 형 맞추라고 

또한 매개변수 써야 하는 거에 안 쓰면 또 오류남. - 주의할 것


메소드 오버로딩  -과

메소드 오버라이딩 - 을 사용해서 메소드를 확장시킴

ㄴ 나중에 하실것


리턴타입 메소드명(파라미터){

메소드내용

}





-유효 범위-


1. 멤버변수(=인스턴스 변수, 필드) - 힙 메모리 이용

메소드 밖에 선언됨

모든 메소드가 사용 가능

변수 사용이 끝나도 GC에 의해 회수 되기 전에는 할당 메모리 유지함. - 그래서 많이 만들면 메모리 낭비인것

GC: 가비지 컬렉터임

값을 안 줘도 기본 값으로 초기화됨! - null, 0, false 이런거...


2. 지역변수 - 스택 메모리 이용

메소드 안에 선언됨

이용이 끝나면 메소드 영역이 없어지면서 변수도 회수됨.

굳이 초기화 안하면 못 쓴다!


그러니까 스택 메모리 쓸 때는 임시적으로(지역변수) 쓰는 거니까 넣었다 뺐다 하기 좋은 스택

힙은 고정적으로 쓰고 ㅂㅂ 할거니까 관리할 수 있는 힙 (객체와 배열 방을 만듬)


// this로 멤버변수 접근

전역 변수 스트링은 정수형크기 정도 되겠다 싶은 것...


package day06;


public class Variable {

String movie = "트로이"; // heap memory


public void show() {

System.out.println("show 메소드 영역: " + movie);

// movie라는 지역변수의 부재로 전역변수 출력

}


public void title() {

String movie = "아마겟돈"; // stack memory

System.out.println("title 메소드 영역: " + movie); // 아마겟돈

System.out.println("title this.movie: " + this.movie);// 트로이

}


public static void main(String[] args) {

Variable v = new Variable();

//show 시작하면 스택 영역에 메모리 잡고

v.show(); // 트로이

//show 끝나면 스택 영역에 메모리 잡았던거 사라지고

v.title(); // 아마겟돈 트로이

}

//메인 끝나고 바로 해제하는 게 아니라 가비지컬렉터가 놀다가 얘를 참조하는 애가 아무도 없을 때 메모리 삭제 - 할거 많으면 천천히 삭제

}


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


package day06;


public class Variable {

String movie; // heap memory


public void show() {

System.out.println("show 메소드 영역: " + movie);

// movie라는 지역변수의 부재로 전역변수 출력

}


public void title() {

String movie; // stack memory

System.out.println("title 메소드 영역: " + movie); // 아마겟돈

System.out.println("title this.movie: " + this.movie);// 트로이

}


public static void main(String[] args) {

Variable v = new Variable();

v.show(); // 트로이

v.title(); // 아마겟돈 트로이

}

}


요렇게 하면 지역변수 movie는 초기화 안해줬다고 오류 뜸
멤버변수는 오류 x (null값이 기본값)


package day06;


public class Block {

String Block = "재미있는 영화"; // 멤버변수 힙


public static void main(String[] args) {

Block b0 = new Block();


String b1 = "트로이"; // 지역변수 스택

System.out.println("Movie: " + b1);


{

String b2 = "우주전쟁"; // 얘는 지역변수

System.out.println("Movie: " + b2);


int i = 0; // 얘도 지역변수


for (int j = 0; j < 5; j++) {

// j도 지역변수다

}

// System.out.println(j); //이거 for문 안의 지역변수라서 x


for (i = 0; i < 5; i++) {


}

System.out.println("i: " + i);// 얘는 선언을 밖에서 해서 ㄱㅊ

} // end {}


System.out.println("Movie: " + b1);

System.out.println("테스트: " + b0.Block);

// System.out.println("Movie: " + b2); //이거 {}안의 지역변수임


}// end main

}



근데

//Block b0 = new Block();

//System.out.println("테스트: " + b0.Block);

요렇게 하면 Block 스택 메모리 잡지 않음


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


Call by Value - 값에 의한 호출 

ㄴ 이거는 메소드 호출시 값을 주는것 

보통 숫자 계열 - 근데 그냥 기본형이면 거의 다 되는것인듯

문자도되고

숫자도되고 어쨌든 예시


구냥 메소드(정수) <- 이렇게 생겼으면 콜바이밸류

값을 복사하는 개념이라서 call by value



Call By Value 예시는 .java 파일 2개 뜨는 것...

그리고 생성자도 써보았다.

생성자는 리턴 타입이 없으신것


public class Person{

public Person(String s){

name= s;

}

}

저렇게 생김.

public Person(String name){

this.name = name;

}

이거랑 같은거지만 그냥 s로 쓰셨길래...


package day06;


class Code{

public String getArea(int index){

String [] areas = {"서울", "천안", "대전", "대구", "광주", "강릉"};

return areas[index-1];

}

}


public class CodeUse {

public static void main(String[] args) {

Code co = new Code();

String area = co.getArea(6);

System.out.println(area);

}

}



요기서
co.getArea(6) <- 이부분이 Call by value







Call by Reference 

ㄴ 이거는 메소드 호출시 해시코드를 주는것

상수 문자열

메소드로 참조 타입을 전송 가능
참조값을 전달한 애는 값 변화 & 힙 메모리 공유한다.


예시가 이건데


package day06;


class SchoolVO {

String name = "";

int kuk;

int eng;

int tot;

double avg;

public SchoolVO(String name, int kuk, int eng){

this.name = name;

this.kuk = kuk;

this.eng = eng;

tot = kuk + eng;

avg = (double)tot/2;

}

}


class SchoolProc2{

public void print(SchoolVO v){

System.out.println("vo.name: " + v.name);

System.out.println("vo.kuk : " + v.kuk);

System.out.println("vo.eng : " + v.eng);

System.out.println("vo.tot : " + v.tot);

System.out.println("vo.avg : " + v.avg);

}

}


public class SchoolUse2 {

public static void main(String[] args) {

SchoolVO vo = new SchoolVO("길동", 85, 80);


// vo.name = "길동";

// vo.kuk = 90;

// vo.eng = 80;

// vo.tot = vo.kuk+vo.eng;

// vo.avg = vo.tot/2;

SchoolProc2 sp = new SchoolProc2();

sp.print(vo);

}

}


여기선 sp.print(vo); 부분이 call by reference 인것 - 왜냐면 vo의 해시코드 값을 주는 것이기 때문에

package day06;


class SchoolVO {

String name = "";

int kuk;

int eng;

int tot;

double avg;

public SchoolVO(String name, int kuk, int eng){

this.name = name;

this.kuk = kuk;

this.eng = eng;

tot = kuk + eng;

avg = (double)tot/2;

}

}


class SchoolProc2{

public void print(SchoolVO v){

System.out.println("vo.name: " + v.name);

System.out.println("vo.kuk : " + v.kuk);

System.out.println("vo.eng : " + v.eng);

System.out.println("vo.tot : " + v.tot);

System.out.println("vo.avg : " + v.avg);

System.out.println("SchoolProc2()-vo 해시코드: " + v.hashCode());

}

}


public class SchoolUse2 {

public static void main(String[] args) {

SchoolVO vo = new SchoolVO("길동", 85, 80);


// vo.name = "길동";

// vo.kuk = 90;

// vo.eng = 80;

// vo.tot = vo.kuk+vo.eng;

// vo.avg = vo.tot/2;

System.out.println("main()-vo 해시코드: " + vo.hashCode());

SchoolProc2 sp = new SchoolProc2();

sp.print(vo);

}

}


요렇게 하면 해시코드 값이 동일한 걸 확인할 수 있음.
주소값 = 해시코드 복사!

그래서 같은 곳을 가리키게 되기 때문에 영역을 공유한다고 함.


//schoolProc2도 변수를 만들지는 않지만 해시코드가 있긴 있음.



-------------------------밥-----------------------------

먹고 와서 이거 하는 중임


package day06;


class Pay {

int ppp;


public void payRefer(Pay a) {

a.ppp = a.ppp + 2000;

}


public void payValue(int j) {

j = j + 2000;

}


}


public class PayTest {

public static void main(String[] args) {

Pay p = new Pay();

p.ppp = 10;

int i = 10;


p.payRefer(p);// cb reference

p.payValue(i);// cb value p.payValue(10)이랑 같은 것 - 변수값을 준다고 cbr이 아닌것 :>


System.out.println(p.ppp);// 2010

System.out.println(i); // return을 안받아서 그냥 i = 10

}

}


근뎅 

public void payRefer(Pay a) {

a.ppp = a.ppp + 2000;

}

이럴 경우에

public void payRefer(Pay a) {

a.ppp = a.ppp + 2000;

a.payRefer(null);

}


이렇게 넣으면 어떻게 되지 - 메소드 파라미터로 자기 자신의 클래스를 받을 때 'ㅅ')...? - 생성자는 배울 것


ㅠㅠ리액션이 안좋은것...


그리고 왜

public int payValue(int j) {

j = j+2000;

System.out.println(" " +j);

return j;

}

하면 리턴값이 2010이 아니라 10이지?


아 이게 지역변수라서 j가 메소드 완료되면 없어져서 그런가보당 맞나 -> 아님 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ


i = p.payValue(i);

i에다가 안넣음 ㅋㅋㅋㅋㅋㅋ


package day06;


class Pay {

int ppp;

int num;

public void payRefer(Pay a) {

a.ppp = a.ppp + 2000;

//a.payRefer(null);

}


public int payValue(int num) {

this.num = num+2000;

// System.out.println(this.num);

return this.num;

}


}


public class PayTest {

public static void main(String[] args) {

Pay p = new Pay();

p.ppp = 10;

int i = 10;


p.payRefer(p);// cb reference

i = p.payValue(i);// cb value p.payValue(10)이랑 같은 것


System.out.println(p.ppp);// 2010

System.out.println(i); // return을 안받아서 그냥 i = 10

}

}


마지막에 i에다가 넣어줘야 한다!
결과값 이상할 때는 메인문 확인해 볼 것....!!!!!


call by value

매개 변수 전달 방식: 값 복사

장점: 원본 값 보호 가능

단점:  메모리 낭비...(별로 안심함)

매개변수 타입: 기본 데이터 타입


call by reference

매개 변수 전달 방식: 레퍼런스 넘겨줌(해시코드)

장점: 메모리 절약(기억장소 공유)

단점: 원본 값 변환됨

매개변수 타입: 레퍼런스(참조)타입 (배열도 포함)


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


String 객체는 의외로 call by reference인데

call by value 같이 생겼음... - 기본형 변수 타입이 아닌것...


문자열 타입은 - 스트링 / 스트링버퍼 / 스트링빌더 가 있는데

스트링만 불변의 특징이 있는것


얘는 다른 애들하고 달라서 "한번정한글자" 를 "한번정한글자당" 으로 바꿀 수 없음.

그냥 "한번정한글자" 가 땡


그리고 클래스인데도 new 안써도됨 ㅇㅇ String name = new String()일케 안써도 됨

그냥 String name = "홍길동" 하면 객체화 완료


그런데 StringBuffer 는 StringBuffer sb = new StringBuffer("홍길동"); 한다음에

StringBuffer sb2 = new StringBuffer("홍길동"); 하면 sb의 홍길동과 sb2의 홍길동은 다른 홍길동인것


근데 String은 

String name = "홍길동"; 하고 String name2 = "홍길동"; 이 가리키는 해시코드값이 동일함 (메모리상으로 하나인것)


만약에 문자열 변경할 때 "안녕" -> "안녕하세요" 했으면

이거 메모리가 해제 안되고 그냥 안녕도 있고 안녕하세요도 있는것...

그러니까 문자열 계속 변경되는 프로그램이면 스트링버퍼 이런걸 써야함 ... <<- 스트링쓰면 메모리 많이 잡아먹는것




문자열 비교할 때는 == 쓰지말고 equals 쓰자!!!


        //System.out.println("ABCD".toLowerCase());  //소문자로 변환     

            //System.out.println("abcd".toUpperCase());  //대문자로 변환

        //System.out.println("ABCD".hashCode()); //해시코드 출력




package day06;


public class StringTest {

public void changeString(String src) {

src = "JSP";

}


public static void main(String[] args) {

// System.out.println("ABCD".toLowerCase());

// System.out.println("abcd".toUpperCase().hashCode());

// System.out.println("ABCD".hashCode());


String step = "JAVA";

StringTest st = new StringTest();

System.out.println(step);


st.changeString(step);//JSP로 변경하기 위해 할당 -> 이긴한데 아까 내가 틀린것처럼 

//step = st.changeString(step);으로 안 고쳐주면 쟤는 증발하는 메소드의 멤바라서 값 차이 없음

System.out.println(step);

}

}


//call by reference치고 넘나 value 같은 것...-_-);;;;;

//


이거 했음.

public void changeString(String src) {

src = "JSP";

}

요게 값을 바꾸는 게 아니라 "JSP"라는 객체를 생성하는거임
그러니까 step이 가리키는 "JAVA"의 값을 바꿔주는 게 아니라서 별반 차이 없음.
결국 결과값을 도출하기 위해서는 값을 받지 않으면 GC인것


저거 위에도

public String changeString(String src) {

return "JSP";

}

이렇게 바꿔주고 step = st.changeString(step) 해줘야 값이 도출된다.

이거 값 받는 걸 자꾸 빠트리니까 메인 문 확인 조심해서 할 것!!!!



멤버변수 = 필드 = 인스턴스변수



package Test_day06;


class Goods {

private String name;

private int price;

private int numberOfStock;

private int sold;


void setName(String name) {

this.name = name;

}


void setPrice(int price) {

this.price = price;

}


void setNumberOfStock(int numberOfStock) {

this.numberOfStock = numberOfStock;

}


void setSold(int sold) {

this.sold = sold;

}


String getName() {

return name;

}


int getPrice() {

return price;

}


int getNumberOfStock() {

return numberOfStock;

}


int getSold() {

return sold;

}


Goods(String name, int price, int numberOfStock, int sold) {

this.name = name;

this.price = price;

this.numberOfStock = numberOfStock;

this.sold = sold;

}// 생성자


}


public class GoodsArray {

public static void main(String[] args) {

Goods goodsArray[] = new Goods[3];


for (int i = 0; i < goodsArray.length; i++) {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("입력하세요: ");

String name = s.next();

int price = s.nextInt();

int n = s.nextInt();

int sold = s.nextInt();

goodsArray[i] = new Goods(name, price, n, sold);

} // end for


for (int i = 0; i < goodsArray.length; i++) {

System.out.print(goodsArray[i].getName() + " ");

System.out.print(goodsArray[i].getPrice() + " ");

System.out.print(goodsArray[i].getNumberOfStock() + " ");

System.out.println(goodsArray[i].getSold() + " ");

} // end for

}

}



이거 입력하세요 부분 없으면 아무것도 안 뜨는것처럼 나옴... -_-);;;
이클립스클라스...

생성자! 
생성자의 매개변수를 통해서 초기화도 하고 입력도 받고 편함 ㅇㅇ

Goods goodsArray[] = new Goods[3];

이거는 

Goods [] goodsArray;

goodsArray = new Goods[3]; 하고 같은거임


static 메소드 사용해 보았다!


package Test_day06;


public class ArrayParameter {


static void replaceSpace(char a[]) {

for (int i = 0; i < a.length; i++) {

if (a[i] == ' ') {

a[i] = ',';

// 만약에 공백이 있으면 ,로 바꿔줌.

} // end if

} // end for

}// end replaceSpace


static void printCharArray(char a[]) {

for (int i = 0; i < a.length; i++) {

System.out.print(a[i]);

}//end for

System.out.println();

// 배열의 문자 출력 -> 다 찍으면 줄바꿈

}//end printCharArray


public static void main(String[] args) {

char c[] = {'T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 'p' , 'e', 'n', 'c', 'i', 'l', '.'};

printCharArray(c);

replaceSpace(c);

printCharArray(c);

}

}


처음엔 그냥 찍어보고 + 공백을 ,로 바꾸고 찍어주고

오!
메소드는 <<코드>>영역에 메모리가 할당되는데 
static이 붙은 메소드나 변수는 <<데이터>> 영역에 메모리가 할당된다.

코드영역 - 해시코드를 통해 접근 필요 (메소드만 옴)
데이터영역 - 객체 생성할 필요 없이 클래스를 통해 바로 변수에 접근 가능 (메소드랑 변수가 옴)


이거 생성자를 이용해서 입력받게 고쳐보기.


package Test_day06;


import java.util.Scanner;


class realCalc {

String cal_num;

double num1, num2;

double printnum;

Scanner s = new Scanner(System.in);


// +

public double pls() {

return num1 + num2;

}


// -

public double min() {

return num1 - num2;

}


// *

public double mul() {

return num1 * num2;

}


// /

public double div() {

return num1 / num2;

}


// %

public double res() {

return num1 % num2;

}


public void inputNumber() {

System.out.print("연산자를 입력하세요: ");

this.cal_num = s.nextLine();


System.out.print("계산할 숫자 두개를 입력하세요: ");

this.num1 = s.nextInt();

this.num2 = s.nextInt();

}


public void printNumber() {

System.out.println("연산자는: " + cal_num);

System.out.println("결과값은: " + printnum);

}


public void calcInput() {

switch (cal_num) {

case "+":

printnum = pls();

break;

case "-":

printnum = min();

break;

case "*":

printnum = mul();

break;

case "/":

printnum = div();

break;

case "%":

printnum = res();

break;

}// end switch

}

}


public class Calculator_machine {

public static void main(String[] args) {

realCalc rc = new realCalc();

rc.inputNumber();

rc.calcInput();


rc.printNumber();


}

}


응 생성자를 이용해서 입력받게 고치고 변수도 더 줄였음.


package Test_day06;


class realCalc {

int num0;// 입력용 연산자

double num1, num2;// 입력용 숫자1, 숫자2 - 숫자 2를 저장으로 사용


String printbuho;// 부호 출력


realCalc() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("연산자를 입력하세요(1 = +, 2 = -, 3 = *, 4 = /, 5 = %) \n: ");

this.num0 = s.nextInt();


System.out.print("계산할 숫자 두개를 입력하세요: ");

this.num1 = s.nextDouble();

this.num2 = s.nextDouble();

}


// +

public double pls() {

printbuho = "+";

return num1 + num2;

}


// -

public double min() {

printbuho = "-";

return num1 - num2;

}


// *

public double mul() {

printbuho = "*";

return num1 * num2;

}


// /

public double div() {

printbuho = "/";

return num1 / num2;

}


// %

public double res() {

printbuho = "%";

return num1 % num2;

}


// public void inputNumber() {

// System.out.print("연산자를 입력하세요: ");

// this.num0 = s.nextInt();

//

// System.out.print("계산할 숫자 두개를 입력하세요: ");

// this.num1 = s.nextDouble();

// this.num2 = s.nextDouble();

// }


public void printNumber() {

System.out.println("연산자는: " + printbuho);

System.out.println("결과값은: " + num2);

}


public void calcInput() {

switch (num0) {

case 1:

num2 = pls();

break;

case 2:

num2 = min();

break;

case 3:

num2 = mul();

break;

case 4:

num2 = div();

break;

case 5:

num2 = res();

break;

}// end switch

}

}


public class Calculator_machine {

public static void main(String[] args) {

realCalc rc = new realCalc();

// rc.inputNumber();

rc.calcInput();


rc.printNumber();


}

}



-----------------------------배열----------------------


package Test_day06;


class realCalc2 {

int num0;// 입력용 연산자

double num[] = new double[2];// 입력용 숫자 1,2 - 2를 출력용으로 사용

String print_modulus;// 부호 출력용


realCalc2() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("연산자를 입력하세요(1 = +, 2 = -, 3 = *, 4 = /, 5 = %) \n: ");

this.num0 = s.nextInt();


System.out.println("계산할 숫자 두개를 입력하세요: ");

for (int i = 0; i < num.length; i++) {

System.out.print((i + 1) + "번째 숫자를 입력하세요: ");

num[i] = s.nextDouble();

}

}


public void printNumber() {

System.out.println("연산자는: " + print_modulus);

System.out.println("결과값은: " + num[num.length - 1]);

}


public void calcInput() {

switch (num0) {

case 1:

print_modulus = "+";

num[num.length - 1] = num[num.length - 2] + num[num.length - 1];

break;

case 2:

print_modulus = "-";

num[num.length - 1] = num[num.length - 2] - num[num.length - 1];

break;

case 3:

print_modulus = "*";

num[num.length - 1] = num[num.length - 2] * num[num.length - 1];

break;

case 4:

print_modulus = "/";

num[num.length - 1] = num[num.length - 2] / num[num.length - 1];

break;

case 5:

print_modulus = "%";

num[num.length - 1] = num[num.length - 2] % num[num.length - 1];

break;

}// end switch

}

}


public class Calculator_machine2 {

public static void main(String[] args) {

realCalc2 rc = new realCalc2();

rc.calcInput();


rc.printNumber();


}

}


Math.sqrt = 루트임 ㅋㅋㅋㅋㅋ
으아 도형 둘레 넓이 ㅋㅋㅋㅋㅋㅋㅋㅋ

캡슐화 private!
setter getter ㅋㅋㅋㅋㅋㅋㅋ - 생성자금지

------------어 하다 끊김 ---------------

package Test_day06;

//파이: Math.pi
class Circle{
//변수는 private
private double num;
private double value;
java.util.Scanner s = new java.util.Scanner(System.in);
public void setNum(){
num = s.nextDouble();
}//setter
public double getNum(){
return num;
}//getter
public void area(){
value = num * num * Math.PI;
}//넓이
public void round(){
}//둘레
public void radius(){
}
//반지름
}

class Triangle{
private int num;
public void area(){
}//넓이
public void round(){
}//둘레
//세변길이
}

class Rectangle{
private int num;
public void area(){
}//넓이
public void round(){
}//둘레
//가로세로길이
}

public class Shape {
public static void main(String[] args) {
}
}



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

http://mathbang.net/99

http://tip.daum.net/question/60107844https://www.google.co.kr/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%EB%84%93%EC%9D%B4%EC%99%80+%EB%91%98%EB%A0%88+%EA%B5%AC%ED%95%98%EB%8A%94+%EA%B3%B5%EC%8B%9D


어 다 짰는데 수정해볼 거 있나 보기..


package Test_day06;


class Circle {

// 변수는 private

private double num;


public void setNum() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("반지름을 입력하세요: ");

this.num = s.nextDouble();

}// setter


public double getNum() {

return num;

}// getter


public double area() {

double val_area;

val_area = num * num * Math.PI;

return val_area;

}// 넓이


public double round() {

double val_round;

val_round = num * 2 * Math.PI;

return val_round;

}// 둘레


public void printShape() {

java.text.DecimalFormat d = new java.text.DecimalFormat(".##");

System.out.println("넓이: " + d.format(area()));

System.out.println("둘레: " + d.format(round()));

}// 출력


}


class Triangle {

private double num1, num2, num3;


public void setNum1() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("삼각형 한 변의 길이를 입력하세요.\n1): ");

this.num1 = s.nextDouble();

}// setter


public double getNum1() {

return num1;

}// getter


public void setNum2() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("삼각형 한 변의 길이를 입력하세요.\n2): ");

this.num2 = s.nextDouble();

}// setter


public double getNum2() {

return num2;

}// getter


public void setNum3() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("삼각형 한 변의 길이를 입력하세요.\n3): ");

this.num3 = s.nextDouble();

}// setter


public double getNum3() {

return num3;

}// getter


public double area() {

double val_area;

double sum = (num1 + num2 + num3) / 2;

val_area = Math.sqrt(sum * (sum - num1) * (sum - num2) * (sum - num3));

return val_area;

}// 넓이


public double round() {

double val_round;

val_round = num1 + num2 + num3;

return val_round;

}// 둘레


public void printShape() {

java.text.DecimalFormat d = new java.text.DecimalFormat(".##");

System.out.println("넓이: " + d.format(area()));

System.out.println("둘레: " + d.format(round()));

}// 출력


}


class Rectangle {

private double num1, num2;


public void setNum1() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("사각형 한 변의 길이를 입력하세요.\n1): ");

this.num1 = s.nextDouble();

}// setter


public double getNum1() {

return num1;

}// getter


public void setNum2() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("사각형 한 변의 길이를 입력하세요.\n2): ");

this.num2 = s.nextDouble();

}// setter


public double getNum2() {

return num2;

}// getter


public double area() {

double val_area;

val_area = num1 * num2;

return val_area;

}// 넓이


public double round() {

double val_round;

val_round = (num1 + num2) * 2;

return val_round;

}// 둘레


public void printShape() {

java.text.DecimalFormat d = new java.text.DecimalFormat(".##");

System.out.println("넓이: " + d.format(area()));

System.out.println("둘레: " + d.format(round()));

}// 출력


}


public class Shape {

public static void main(String[] args) {

Circle david = new Circle();

Triangle david2 = new Triangle();

Rectangle david3 = new Rectangle();


david.setNum();


david2.setNum1();

david2.setNum2();

david2.setNum3();


david3.setNum1();

david3.setNum2();

david.printShape();

david2.printShape();

david3.printShape();

                  

}

}




5. 수업

진도: 

hw:

 

1. 커서 고정하는 법


6. 할것

졸려서 1교시 수업시간 끝나고 잤음...

1. 오늘은 일찍 잘 것

2. 자료구조 메모리 쪽 볼 것 (힙 스택)

3. 아무래도 BMO 지갑 사야함 (이유: 귀여움)

4. 머리카락을 자르러 가야함(안 피곤한 날? 'ㅁ')

5. 이모한테 전화할 것

6. 배타적 논리합 / 논리합 / 논리곱 한번 더 안보고 쓸 것

7. 오락실에 다트판 없나 봐야지...

8. 그리고 그냥 슬리퍼 갖다놔도 되지 않을까

9. http://www.lectureblue.pe.kr/reqtiles/gread.jsp?bbsno=473&nowPage=1&col=content&word=equals&code=5

이거 do-while로 짜보기.





*1. 하얀색 옷 살 것

*2. 마방진으로 하트 만들어보기


'Programming' 카테고리의 다른 글

160323: 8회차  (1) 2016.03.23
160322: 7회차  (4) 2016.03.22
160318: 5일차  (2) 2016.03.18
160317: 4회차  (3) 2016.03.17
160316: 3회차  (2) 2016.03.16
Posted by DAVID

160318: 5일차

Programming 2016. 3. 18. 18:29

1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것

하다보면 MySQL을 할 것임.

오전엔 복습을 하는 것.

- Day 02 

// 저번 기수는 박스오피스 웹사이트 만들었음.

// 5주 정도 프로젝트 하는 것 - 오~    

// 스프링 마이바티스 이런 애들도 쓸 줄 알아야 함미다 으아ㅏ아ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ


while( (i=s.nextInt()) != 0){ //s의 입력값이 0일 때까지 계속 돌리기

sum = sum+i;

n++;

}

이거 복습 하고 있음

s.nextInt() 이거 약간 단어가 안 익는다 - 아! s는 스캐너 변수인데 위에 있는것... (생략)


if(i%2==0){

sum = sum+i;

// System.out.println(i);

continue;

요거 짜는데 continue 안 넣었음... 오늘의 트롤은 Continue



[01] 제어문 예제
>>>>> Test01.java
public class Test01 {
           public static void main(String[] args) {
                     for (int i = 1; i <= 5; i++) { // 위에부분
                        for (int j = 1; j <i; j++) {
                                   System.out.print("*");
                        }
                        System.out.print("\n");
                     }
                     for (int i = 1; i <= 6; i++) { // 아래 부분
                          if(i>1){
                               for (int j = 0; j < i-1; j++) {
                                          System.out.print(" ");
                               }
                           }
                          for (int j = 1; j <=(6-i); j++) {
                            System.out.print("*");
                          }
                         System.out.print("\n");
                     }
           }
}


격파하였다


package day05;


public class Handle_test1 {

public static void main(String[] args) {

for(int i = 0; i<5; i++){

for(int j = 0; j<i; j++){

System.out.print("*");

}//end for2

System.out.println("");

}//end for1

//--------------up-----------------//

for(int k = 0; k<6; k++){

for(int m = 0; m<k; m++){

//지나감

//0

//01

//012

//0123

System.out.print(" ");;

}//end for2

for(int l = 5; l>k; l--){

System.out.print("*");

}//end for3


System.out.println(" ");

}//end for1


//--------------down---------------//

}//end main

}



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

수업중인데


예제 Day03에 있는거

while(true){

if(s.nextInt() == -1){

break;

}

cnt++;

}

이렇게 짜는거 안 해봐서 어려움 해보기 ㅇㅇ

입력값 주는게 어렵다.


저거 썼을 때 -1 이후에 더 입력했더라도 -1전까지만 개수 카운트 해줌


배열 쓸 때

int arr[] = new int[5];

이렇게 뒤에 new를 통해서 만들어야 한다. - 해시코드가 만들어지쉬는것



package TestDay05;


import java.util.Scanner;


public class ArrayAccess {


public static void main(String[] args) {

// 5개짜리 정수 배열 만들어서 나중에 최대값 출력해주면 됩니다.

Scanner in = new Scanner(System.in);

int arr[] = new int[6];

arr[5] = 0;

for (int i = 0; i < (arr.length-1); i++) {

System.out.print((i+1) + "번째 정수를 입력하세요: ");

arr[i] = in.nextInt();


if (arr[arr.length-1] < arr[i]) {

arr[arr.length-1] = arr[i];

} // end if

} // end for

System.out.println("\n입력한 정수 중 가장 큰 수는 " + arr[arr.length-1] + "입니다.");


}// end main

}


에이씨 마지막 방을 가리키려면 배열.length-1 해야한다... 0부터니까 -_-+


오늘 배운거는 지역변수 특징 - 자신이 속한 단락 안에서만 사용 가능.


double은 int값 자동으로 형변환해서 강제형변환 안해도 된다.


//2차원 배열은 넘어갔습니다 - 해보기...


Day 4 하는중 


오 스캐너 사용할 때

java.util.Scanner in = new java.util.Scanner(System.in) 이렇게 쓰면 임포트 안해도 됨 ㅇㅇ..

그냥 문자열 입력 받을 때는 next() 쓰는거십니다

////////////////////////////

2번째거 *출력이랑 숫자 출력까지는 뽑았음 - 띄어쓰기를 만듭시다.

////////////////////////////


앜! 데시말포맷! DECIMALFORMAT - 이거 돈 관리하는 걸로 두번정도 짜보기!

Switch문도 써보기!!!!


예제 04 에서 성적만 수업시간에 했음 

substring = 문자열 추출

문자열의 index를 사용해서 변수의.substring(여기부터,조기까지) 추출 - 인덱스의 끝 인덱스의 바로 전까지만 추출 가능하다.


Calendar 같은 경우에는 객체를 생성한 뒤(변수같이 생겼음) 메소드를 통해서 값을 추출 가능


-------------발표하는데 버그남 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ------------------------------ 

equals를 씁시다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

package TestDay04;


public class Test_6 {

public static void main(String[] args) {


int cnt = 0;


while (true) {


if (args[cnt].equals("exit") ) {

System.out.println("입력 완료.");

break;

}


if (Integer.parseInt(args[cnt]) == 0) {

System.out.println(args[cnt] + "은 0");

} else if (Integer.parseInt(args[cnt]) < 0) {

System.out.println(args[cnt] + "은 음수");

} else

System.out.println(args[cnt] + "은 양수");


cnt++;

}

}


}


으아아 문맥적 버그ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 사바ㅏㅂㄷㅈㅂㄷㅈㅂㄷㅈㅂ덥ㅈㄷㅈㅂ
어쨌든 equals라는 애를 알았습니다 넘나좋은것...

==랑 equals의 차이는 ==는 주소값 비교고 equals는 값 자체를 비교하는검미다

아니면 카운트한 변수 값이 args의 길이와 같으면 종료하는 경우로 바꾸는게 더 좋겠어 식식 분하다!!
****지만... cnt == args.length 면 종료 **...


으아아 하루에 필요한 채팅량을 충족할 수가 없으니까 여기다 많이 씁니다.


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


객체를 위한 클래스


객체: 물리적인 공간을 가지고 있는 구체적인 것 - 자동차 같은 거 (실제로 돌아다니는)

근데 자동차를 만들려면 설계도 같은 게 있어야되잖아 -> 그게 클래스 = 그래서 객체는 클래스의 실체!

구래서 클래스 1개로 객체 여러개 가능

마자 그래서 실체 = 객체 = 인스턴스 = instance (영어로 하면 인스턴스 -_-);;) 


붕어빵...으으붕어빵

광어빵

잉어빵

황금잉어빵

우럭빵

대게빵


클래스는 동일한데 객체는 좀 다를 수 있음

ex) 도면은 같아서 내부는 똑같은데 외부는 매우다른 집


클래스: 은행계좌

객체: 나의은행계좌 너의은행계좌 우리의친구의은행계좌


ㅇ예~~~클래스~~


클래스 - 필드랑 메소드가 있음

필드: 변수임 (=인스턴스 변수 = 멤버 변수 ) - 얘 지역변수랑 다른거임 걔는 전체적으로 쓸수가없어...

- 전역변수 같은건데 이름을 그렇게 부르기는 객체지향에서 뭐해서 멤버라고 부름 멤버 변수 필드 인스턴스변수 


메소드: 함수임(=인스턴스메소드 = 멤버메소드) - 얘 일하는애임 

- 얘가 필드를 처리하는 기능임여 - 인스턴스함수 인스턴스메소드 멤버함수 멤버메소드

-메소드 연기랑 별로 상관없겠지 크


객체는 힙 영역에 메모리가 잡힘 - 정신이 혼란스러우니 복습할 것 


1) 클래스를 만들 것

public class Student{

String name;

int rollNo;

}


이래놓고 Student david = new Student(); 일케 쓰면 됩니다.

- 데이비드가 참조 변수임 - 해시코드가 필요함용


뉴! new: 메모리 할당


Student alice = new Student(); 일케 써도 됨 (클래스니까!)

존도 써도 되고 데이빗도 써도 되고 앨리스도 써도 됩니다


//얘들을 보고 참조형타입이라고 부름

이유: 참조값이 들어가니까 

참조값: 해시코드임


//그림이 여캐는 넘 섹시 타입임니다


그리고 클래스마다 파일 하나씩 만드는 편이 좋겠어

Testsample클래스는 Testsample1.java 


하나의 파일에 클래스 여러개 넣으면 

class A{


}


class B{


}

이럴 경우에 파일명을 뭐로 하지 -> 메인 메소드 있는 걸로 해주면 됨미다

B에있으면 B.java

A에있으면 A.java


아 맞아 그리고 B.java로 했을 때 B는 public class로 만들어줘야함.

왜냐면 main문있는 class는 퍼블릭으로 안만들면 접근을 못함 - 넘나구진것


사실 여러 개 클래스 따로 따로 자바파일로 만들면 퍼블릭이고 뭐고 그냥 클래스 이름으로 하면됨 -_-);;


두개 이상 있으면 main문+public 있는 클래스로 하면 됩니다.


클래스 내의 멤버 변수에 수식을 넣으면 왜 처리 결과가 0될까 - 의문 - 아! 이게 메소드군!


오예 2개남음


class Pay{

String name;

int bonbong; 

int tax;

int silsu;

}

요럴 경우에 스트링은 해시코드니까 int 취급해서 int*4 = 16바이트짜리 메모리인것


근뎅 왜 수식은 못넣을까! 내가 못짜나!

아니면 초기화는 못하나...? -ㅅ-);;; // ㅜㅜ아닌데


저렇게 클래스 내가 만들어놓고

Pay david = new Pay(); 하면 객체 하나 만든거임 - d(-_-)b

저러면 david.name 이런 식으로 접근 가능

쟤네들은 데이빗 객체 안의 멤버 변수임 


.으로 그곳에 접근함 흫ㅎㅎㄽㅎㅅㅎ


p1.tax = (int) (p1.bonbong * 0.045 + 0.5); 

조고 왜 캐스팅했냐면 결과값이 실수임미다 -_-+

더블더블



아 메소드가 함수같은 검미다

아 그냥 함수네 ㅋㅋㅋㅋㅋ


메쏘드는 퍼블릭으로 만드러야 합니다


이렇게 생겼음

public int taxCalc(){


}


taxCalc 호출하면 int값을 리턴한다는 얘기신것

그래서 리턴 해줘야됨

그러면 이렇게 생김

public int taxCalc(){

return 0;         //0아니어도 정수값 리턴할 거 쓰면 됨...

}

이거는 함수 줄 때 p1.bonbon 이런 식으로 주면 에러나쉬는것

그러니까 그냥 bonbon(이거 멤버변수 이름)



근데 메소드는 객체 안에 선언을 하기는 하는데 메모리상에 힙 영역에 있는 건 아님


우리의친구 메모리 영역 이름


1. 스택 - 지역변수

2. 힙 - 배열 & 객체

3. 코드 - 이거 메소드(객체의 함수) ㅋㅋㅋㅋ아옿ㅎㅎㅎ 가 있는 공간인데

4. 데이터 - ㅇㅇ이따나옴 머리가아픔


요기 가려면

멤바변수나 객체가 가지고 있는 해시코드로 호출하는거임 ㅋㅋㅋㅋ ;;(-_-);;;


ㅇㅇ 그러니까 객체를 생성해야지만 메소드를 쓸 수 있는데

메쏘드 메소드 메서드


프린트같은 건 리턴값 없어도 되어서 이런건 걍 ㅣㅇ렇게 생김

class void printhaseyo{


}

오 프린트 박으니까 넘나좋네여 ㅋ(-_-)ㅋ

15줄 ->3줄 객체짱짱맨





메소드 하니까 조커 연기가 누구였지

메소드... 디카프리오 ... 잭... 뭔데 잭....잭 잭 ... 잭 잭... 잭 블랙 ...?

그 싸이코 연기 한 배운데 ㅇㄴㅁ안ㅁ아ㅣㅁㄴ히스레저

디카프리오가 점점 닮아가는 얼굴인 배우인데!!!!!

잭 니콜슨

어휴 https://namu.wiki/w/%EC%9E%AD%20%EB%8B%88%EC%BD%9C%EC%8A%A8?from=%EC%9E%AD%20%EB%8B%88%EC%BB%AC%EC%8A%A8




-----------------1시간뒤면 신난당-------------------------~_~


이예~~~ 그리고 인터넷있었음 OTL.... 69017000...

와이파이 ㅠㅠㅠ


그리고 


public int silsuCalc(){

return bonbong - taxCalc();

}

System.out.println("세금: " + taxCalc());


이렇게 바로바로 메소드 내에서 출력할 수 있음

멤바변수는 줄이고 메소드는 늘립시다.


메모리 아끼쉬는것


근데 함수 내에서 응 스캐너도 받을 수 있음 ㅇㅇ //이거 한번 집에 가서 또 짜봐야겠따


next()는 스페이스를 한 단락으로 인식하고 nextLine()는 엔터안 치면 스페이스를 한 단락으로 인식하고 

구래서

public void payinput(){

System.out.print("이름과 본봉을 입력하세요: ");

name = s.next();

bonbong = s.nextInt();

System.out.println("");

}


이렇게 짜면 입력: 김김 23232 했을 떄 엔터 한번에 입력 o


public void payinput(){

System.out.print("이름과 본봉을 입력하세요: ");

name = s.nextLine();

bonbong = s.nextInt();

System.out.println("");

}

}


이렇게 짜면 입력: 김김 2332323 했을때 엔터 한번 치면 이름이 "김김 2332323" 이 됨


-찾아볼 것: 이놈의 커서 맨 끝으로 고정하기-  

  1

 121

12321

 121

  1

이거 짜고 갈 것... 일단 로그오프!




5. 수업

진도: 

hw: 

11문제 풀어볼 것!



6. 할것


나갈때 티스토리 로그아웃 할 것 - 안그러면 집에서 비번 맨날 바꿔야해 짱귀차나 ㅠㅠ...


예쓰! 5일차!

1. 학원에서 제어문 예제 좀 공부할 것. - 값좀 써보면서 짜고 답 맞춰 보기... 씪씪 

2. 쿠페한테 깔아둘 것 - 얘 랜선 연결하는 거 하고 etc 좀 찾아두기 (옆에 정리함에 있을 듯)

3. 우쿨 조율 해놓기

4. 오늘 급하지 않으니 술집 안 나오는 쪽으로 길 찾아두기

5. 학원 (4월부터 시작 하는 것) 알아보기 - 문화원 연계가 되면...

6. 하얀색 옷 좀 살 것 - 으으 검정의 향연...

7. 게임 그 ** 보스좀 잡을 것 - 주말의 목표 -_-)b 왜 한명만... 왜... 

8. 옷장 정리를 할 것 - 뭐가 어디에 있는가 ...

9. windows 로고 + ctrl + d 이거의 친구 & 이거 이름좀 알아볼 것

10. 승질나니까 인강도 듣기 - 스터디데스크.co.kr 아이씨! - 오늘 버그만듬 버그버그 버그! 으아아 ***가 고쳐줌...

11. 머리도 자를래 으으

12. 슬리퍼도 갖다 놓을까 <-... (-_-);;

13. do while 예제 한 5개 만들어보기

14. 마방진으로 하트 만들어보기 (-_-);;;

15. 앜 매물 하나 놓쳤다!! **

16. 집에 가서 샤이닝 다운받아서 봐야지 

'Programming' 카테고리의 다른 글

160322: 7회차  (4) 2016.03.22
160321: 6회차  (1) 2016.03.21
160317: 4회차  (3) 2016.03.17
160316: 3회차  (2) 2016.03.16
160315: 2회차  (1) 2016.03.15
Posted by DAVID

160317: 4회차

Programming 2016. 3. 17. 18:30

1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


오늘 7장 도스창에서 입력받는 것 (editplus로 코딩후 cmd창에서 컴파일하는 거) - 부터 시작


class Hello{

   public static void main(String[] args){

String a = args[0];

String b = args[1];

String c = args[2];

String d = args[3];


System.out.println("args길이: " + args.length);

System.out.println("a: "+a);

System.out.println("b: "+b);

System.out.println("c: "+c);

System.out.println("d: "+d);

}

}


이런 코드인데 만약에 도스창에서 String 입력 받아야 할 때 값을 안 넣으면 java.lang.ArrayIndexOutOfBoundsException 뜸

= 배열의 첨자가 범위를 벗어났다는 뜻이라고 ... -.,-) 이게 값을 안 넣으면 [0]까지만 가리키고 있으니까 [3]까지 접근을 못해서 그럼

그리고 입력 받는 개수는 늘어나도 상관없는데 출력은 4개만 해놓아서 4개까지만 뜸

cmd 창에서 javac 써서 컴파일 하는 건 가끔 하나 보다... :<


String 한글도 됨 -_-)b - 근데 이거 할당 해제가 자동인가 자바는... 메모리 관리를 어떻게 하쥐 (나중에 하겠지뭐...)



Integer 변환하쉬는것 - 중요하신것


public class DosInput2{

public static void main(String[] args){

int i1 = Integer.parseInt(args[0]);

int i2 = Integer.parseInt(args[1]);


System.out.println("args.length : " + args.length);

System.out.println("i1 : " + i1);

System.out.println("i2: :" + i2);

System.out.println("i1 + i2 : :" + (i1+i2));

}


}


Integer.parseInt 할 경우 int 타입이 안 들어가면 java.lang.NumberFormatException 뜸

형식이 틀렸어요 잘하세요 인것 


인티저.파스인트 외울 것 ★ 우리의친구임 


Integer.parsInt - 정수 모양을 가지고 있는 문자열을 정수형으로 변환해주는 메소드 

정수(숫자) 말고 다른 거 입력 못 받으쉬는것

이렇게써요: Integer.parseInt("100") - o


하지마쎄여1: Integer.parseInt(null) -   x 값이없는것

하지마쎄여2: Integer.parseInt("3.15") - x 실수형

하지마쎄여3: Integer.parseInt("a") -    x 문자형


외우시는것

그리고 우리의 외주 친구는 Double.parseDouble 이런 애도 있음 - 얘는 3.15 이런거 사용 가능


오류 메시지 친구 - 널포인트익셉션도 우리의친구임


lectureblue에 Calc 예제 for문에 for(int i = 0; i<args.length;i++)로 수정

하드코딩 너무 불친절합니다.             

java Calc  3212 321 321 321 321 312 312 321 312 321 321 321 312이런 식으로 입력해야 해서 불편함            

한개씩 받아도 계산할 수 있게 해주라고!


main의 args는 보내는 만큼 확장 가능한 배열 넘나 좋은것 - 이아니라 이거 메모리 관리 어떻게 하는 건갓 ㅠㅠ...메모리모리메리모



DecimalFormat: 숫자에 , 넣어줘서 이쁘게 보이는 건데 DecimalFormat이라는 객체(예약어임)를 이용해서 숫자를 넣으면

이건 숫자가 아니라 문자화 되어지는 거임


DecimalFormat 변수 = new DecimalFormat("###,##0"); 같이 사용한다. - 문자열로 취급받음.

결과값은 3,000,000 같이 나온다.

###,##0 == ###,###


//cmd창 복사 : 표시 선택 -> 블록후 오른쪽마우스 클릭 : 복사된것


/*

1. 이름 2. 전화번호 3. 주소 입력받아야함 (전화번호도 문자)

주소의 경우 " "로 입력하면 띄어쓰기 포함


예시: 홍길동 010-9999-9999 "서울시 관악구"

*/


//import java.text.DecimalFormat;


public class Myinfo{

public static void main(String [] args){

// DecimalFormat phone_type = new DecimalFormat("###-###-###");


String name = args[0];

String phone_num = args[1];

String address = args[2];


System.out.println("\n이    름: " + name);

System.out.println("전화번호: " + phone_num);

System.out.println("주    소: " + address);


}//end main



}//end class


데시말포맷으로 숫자 그냥 받아서 010-0000-0000 로 나오게 해보기 - 집 가기 전에 해 볼 것 

//이건 안되는 거십니다 -.,- 데시말 포맷의 separator는 .랑 ,밖에 못쓰나봄...(구졌음) 

https://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html

숫자를 인용할때 사용하는 포맷이기 때문에 전화번호용인 "-"은 사용 불가능

//하이픈 넣으려면 - http://blog.publisher.name/589 참조 <<-

substr 개념 나올 쯤에 하것지...



이클립스에서 콘솔창 실행하는 것처럼 하려면 

run->run configurations -> (x)=Arguments 의 Program arguments에 값 넣어주면 됩니다.


java.lang 패키지안에 int system 이런애들이 기본적으로 있어서 자동 import인것 - 안 해줘도 compile 할 때 자동으로 해줌

그리고 이클립스 오토 기능 넘나 좋은것


System.in : 자바 표준 입력 장치

System.out: 자바 표준 출력 장치 

- 만약에 system.in 사용해놓고 입력 안 하고 있으면 프로그램 계속 돌고있음...


어쨌든 일은 메소드가 한다 (Scanner의 nextInt라는 메소드 같이)

 

★★★클래스★★★



GradeSwitch

case"A":

case"a":

System.out.println("A");

break;

case"B":

case"b":

System.out.println("B");

break;


OR 처럼 쓰고 싶으면 저렇게 써야 한다.


hasNext(): 다음 입력이 있는지 체크 (다음에 뭐 가져올 게 있나 체크)

스캐너변수.close() : 스캐너 닫았다고 - 이거 하면 전역변수 안해도 exception 안뜸 -_-)b 올ㅋ


////////////////////점심////////////-아 오늘은 6천원 ㅇㅇ//////////


System.in.close(); 를 사용할 때는 try catch문 써야 함 ㅇㅇ

안쓰면 i/o exception 뜹니다

surround with try/catch 문 자동완성이 있음!


ㅇㅇ 08은 파워복붙임 집에 가서 쳐봐야지 :>

오 Math.random() 씀 넘나좋은것

Math 클래스의 random() 메소드 = 난수 생성 메소드 (0~1.0까지라서 *45+1 하면 1~45임(1 안더해주면 0부터 45까지라서 -,.-))

a[i] = (int) (Math.random() * 45 + 1);

요런 식으로 쓰는데 강제로 형변환함

예제는 로또임


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


<< 자바 실습문제 >> 
 
1. 배열의 저장된 5개의 점수를 생성해서 반복문으로 배열 일관처리로  
   총점을 구한후 평균을 구해서 출력하세요. 
정수를 넣기 +for문써야함 + 배열
 
 
2. 배열의 저장된 5개의 실수를 생성후 최대값과 최소값을 구한후 
   출력하세요. 
실수를 넣기 +  최대값: max / 최소값: min + if문 2개 기본인것
실수형 암거나
 
 
3. 배열에 저장된 5개의 음수, 양수를 절대값을 구해서 
   출력하세요 
음수: 0보다 작을 시 -1을 곱하시는것
 
 
4. 프로그램 실행시 main 인자값으로 본인이 정보(이름, 전화번호, 주소,주민번호)를 입력받아 
   이름, 전화번호, 주소, 나이를 출력하세요.

 
//주민번호에서 나의 태어난 연도 뽑기 
String jumin= args[3]; //921008-2078815 
int iage = Integer.parseInt(jumin.substring(0,2)); //0은 포함 2까지...(-_-);; - 모지이게 순번인가?0번째~1번쨰까지 - 2는안포함
iage += 1900; //1992 
 
//현재년도 알아내기
Calendar calendar = Calendar.getInstance(); 
int currYear= calendar.get(Calendar.YEAR); //아 iage에서 빼면 나이가 나옴입니다 -_-+
 
 
5. 프로그램 실행시 main 인자값으로  숫자 2개를 입력받아서 최대값과 최소값을 구해서 
   출력하세요. 
     //정수이쉰것
 
6. 프로그램 실행시 main 인자값으로 정수를 입력받아서 양수인지, 음수인지, 0인지를  
   판단후 출력하세요. 
    //얘도정수


7.  다음의 코드조각들을 바르게 조합하여 아래 결과값이
    출력되도록 만들어 보세요
   //으아아 매칭ㅇㅇㅇ 이러기야 ㅋㅋㅋ
 
   c:>java Test
 
      0      4
      0      3
      1      4
      1      3
      3      4
      3      3
 
  >>> 코드 조각들
  x++;
  if(x==1){
  System.out.println(x + "" + y);
  class Test{
  for(int y=4; y>2; y--){
  for(int x=0; x<4; x++){
  publc static void main(String[] agrs){



8. 자바의 기본형타입(8가지)과 크기를 byte단위로 명시하세요
 
  예)정수
     int(4byte)
 
  
 
 
9. 문장내에서 continue 문을 쓸수 없는 문장은?
 
 1)  for 문           2) while 문
 3)  do while 문      4) switch문
   
 
 
10. 실행되는 순서를 작성하세요
 
   for(int i=0;i<100;i++){
          [1]  [2]   [3]
 
 
 [4] -실행내용
 
   }
 
 
   예) [2] -> [3] -> [4] -> [1]-> [2] ->[3]
 
 
11. Scanner객체를 이용하여 나의정보(이름, 주소, 생일)를 
    입력받아서 정보(이름,주소,나이)를 출력하는 class를 작성하세요


 

//다풀었음 :< //나이거 스캐너를 이용해서 올렸으니까 도스 프롬프트 쓰는 법 집에서 해봐야함 - 

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





5. 수업

진도: 

hw: 


6. 잡

집에갈때 체했을 때 먹는 약 사가기 - 맛 안 이상한 비타민제(비타500 아닌 맛)도 생각해 보아요

호박죽도 사가기! - 죽! 죽죽죽죽죽


미에로화이바 몇년만에 먹으니까 맛이 당근주스 같아짐 = 승질나는것

몸이 안좋으니까 하얀 색 입고 잘 것


//http://www.colourpod.com/post/39860655902/bmo-submitted-by-r4ygun-69ae9c-78c4af-92cdbc - 비모

http://www.oeker.net/bbs/board.php?bo_table=designer4&wr_id=186936

FERO한테 과자 보내주기! - 우체국 몇시에 닫더라? 


옆에 타이틀창 확장시 색깔 구리게 나오는 것(회색조) 변경하는 것 찾아내리라 (**)  

1) 왜그럴까: 이거 씨꺼먼색 투명화해서 이상한 색 되는거

2) 왜그럴까: 그냥 저게 파일일까? - 근데 이미지 파일 내에 없음 


ㄴ 아 배경 바꾸는 법은 찾음 ㅇㅇ 쉬움 - 근데 옆에 타이틀창 확장시 변경을 못잡겠음


taskmgr - 이거 작업 관리자 명령어임 -_-)ㅋ


http://www.w3schools.com/html/default.asp

CSS!

http://html-color-codes.info/Korean/

'Programming' 카테고리의 다른 글

160321: 6회차  (1) 2016.03.21
160318: 5일차  (2) 2016.03.18
160316: 3회차  (2) 2016.03.16
160315: 2회차  (1) 2016.03.15
160314: 1회차  (1) 2016.03.14
Posted by DAVID

160316: 3회차

Programming 2016. 3. 16. 18:30

1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것

제어문

분기문 

1. if 

if else

if else if 

IfExam은 else 안쓰고 if문만 사용한 분기문: == (비교할 땐 이걸로. 뜻: 같다)

IfExam2는 if else 문: 별거 없음

IfTest1은 종합세트


2. Switch

Switch - case - break - default

정수형만 사용 가능: byte short int long // char나 String 도 사용 가능하긴 함

Switch(조건식){

case (값):

break;

↓

case (값);

break;


default:

break; //default도 break를 해줘야 빠져나갈 수 있음.

}

switch문의 조건식의 계산결과는 int 범위 이하의 정수만 가능하다. (값 or 상수)

Switch를 이용한 실습예제를 해 보았음 -> Scanner 써봤는데 공부해야할듯 -_-);; import 넘나 어려운것


논리 연산자를 이용한 제어 조건의 이용

|| : 앞의 애가 참이면 뒤의 애를 검사안함 = or연산

&&: 앞의 애가 거짓이면 뒤의 애를 검사안함 = and연산

//괄호 오타 조심하기


반복문

While

-조건 만족후 종료

do-While

-무조건 한번은 실행 (do 구문안에 있는건 한번은 돈다)

do{

~작업문~

}while(조건식) // 조건이 true이면 반복 / false이면 반복 종료 / 조건식 뒤에 뭘 써서 while문처럼 사용은 불가능.

for

for(초기문; 조건식; 반복후작업) { 

~작업문~

}

for(1; 2; 4){

3

} //작업 순서인것

초기문: 초기화 작업을 위해 한번 돌아가는 것

조건식: 논리형 변수나 논리 연산만 가능(i<=10 이런거)

작업문: ㅇㅇ작업문

반복후작업: 조건식->작업문->그담에 반복후작업(완료 안되었으면 다시 조건식 루트)


break; = 자기가 속한 반 복문 벗어날 때 쓰는 것


갑작스런 배열

배열 생성후 변수에는 해시코드가 들어감 

ex) int [] pay = {10, 20}; // pay에 해시코드가 들어감


메모리 

Stack (호출되었다가 사라짐)

지역변수

사용이 끝나면 메모리 할당 해제


Heap (가비지컬렉터에 의해 관리됨)

객체, 배열 

배열의 경우 pay 배열(생성되는 방)의 메모리 주소를 가리키는 해시코드를 pay라는 지역변수가 가지고 있음.

참조하는 변수가 사라질 경우 가비지컬렉터에 의해 메모리 할당 해제

//접근하는 법= 객체 접근: . 배열 접근: [] 

점심먹고 중첩 for문 써보았다.

break문에 label 다는 것도 있긴있음 - ㅇ...goto문 같은거임...label 이름은 변수처럼 내가 지을 수 있음

goouter: for (int i=0; i<=2; i++) {  //저렇게 앞에 선언 

                    for (int j=2; j>=0; j--) { 

                        if (i==j) break goouter; //break문 사용할 때 이 루틴을 종료시킴 

                        System.out.println("i==" + i + " j==" + j); 



break: 루틴을 벗어남

continue: 루틴을 벗어나지 않고 계속 사용함 

  for (int i=0; i<=2; i++) { 

                             //  ┌ continue시 이동되는 곳   

                             //  ↓  

            for (int j=0; j<=2; j++) { 

                if (i==j){ 

                    continue; 

                }else{ 

                    System.out.println("i==" + i + " j==" + j);                     

                }  //사실 이거 else 없애고 그냥 println 해도 나옴

이렇게 자기가 속한 루틴 내의 상위로 가서 돌림    


점심 뒤에 파워 복붙코딩


배열: 크기 변경 불가능

Collection Class: 크기 변경 가능 (이게뭐지)

배열 선언시 

1. int[] intarray 

2. int [] intarray

3. int intarray [] 


1이나 3을 많이 씁니다 - 에이씨! (-_-) 뒤에 써도 맞는 거임

어쨌든 저렇게 선언만 하고 생성을 안하면 아직 해시코드는 없음.

int [] weight = new int[7] 이렇게 하면 28바이트 할당

int weight[] = {100, 200}; 이렇게 하면 그냥 요소가 결정이 되고 값이 할당됨 ㅇㅇ


1차원 배열은 그냥 1차원 배열 같이 생겼습니다 

String [] lang = new String[4];

이렇게 짰을 때

lang[0] = ("JAVA");      ==      lang[0] = new String("JAVA");

-> 배열의 각각 방이 생성되는 객체의 해시코드값을 가지고 있음.


Scanner 써보았다.

import java.util.Scanner; // import java.util.*;

Scanner 변수이름 = new Scanner(System.in);

int(예시) i = 0;

i = 변수이름.nextInt(); 

하면 입력된다.


System.out = 표준 출력장치

System.in = 표준 입력장치

.을 통해서 메소드도 호출 가능. (위에서는 스캐너의 nextInt 메소드를 호출하였다)


갑자기 헷갈려서 - 가로 행 세로 열

[3][2] 3행 2열

이면 

1차원 배열과 동일하게 열 2개를 가리키는 해시코드를 만든 뒤 각자 3행짜리의 해시코드값을 가지고 있음.(혼란)

ar[2] (ar_이가리키는해시코드_)□□

ar[2][3] (ar_이가리키는해시코드_)□□ 같이 생겼는데 얘네가 또 각각 (해시코드_)□□□를 가리키고 있음.

3차원 면-행-렬

2차원 행-렬

1차원 렬


근데 자바는 컬렉션 클래스를 쓰기 때문에 3차원까지 안감 -_-)b ㄴㅁㄴㅁ


Scanner로 입력받을 때 nextInt nextDouble 등으로 타입을 다르게 입력받음...



5. 수업


진도: 

lecture 07 중반

hw: 

System.in의 in은 inputstream,이라서 in.close 이런 식으로 해제하면 메모리 ㅂㅂ 

오예

느낀 점: 앞자리가 모니터가 더 나은 듯 - 상태와 내 집중력이 분산된다고! 으으 -ㅠ-

switch문 범위 설정해서 조건문으로는 못 짜나?

//no else

if(year >= 1){

if(child > 1){

pay = pay + (child * 200000);

}

}

이거 생각해 보기 year의 디폴트는 0임. -> 오 풀었음 -_-)b

switch(year){

case 0:

break;

default:{

switch(child){

case 0:

break;

default:

pay = pay + (child * 200000);

}//end switch_2

}break;

}//end switch_1


그런데 이런 코드를 쓰지 말고 그냥 if를 쓰는 편이 좋겠어 


i++ ++i 이거 개념좀 몇번 더 보기 - 내가 생각하는 거랑 딱 반대가 맞는 거임 이 **

오늘도 xor을 틀렸나이다 ** 우리의 친구 같이 생긴 애임 ^ <<- ^^





System.out.println(System.identityHashCode(변수));

//이렇게 하면 해시코드값 얻을 수 있긴 한데 이걸로 원래 주소값을 찾을 수가 있나






mia blog:

<<집에 가서 할 것>>

1. 위젯 좀 달아보기 (간단한 d-day 카운터) -> 위젯뱅크 문닫음

2. 게임 ... 켜놓고 심플한 디자인좀 빼보기 -.-); - 그냥 있는 거 수정만 하기로 (내 로고 원본 찾기 or 뭐 하나 만들기)

3. ↑ 이거 닉네임 바꾸면 인벤토리 비워야 하나 찾아보기... 설명 다시 보기 - 이건 다시 봐야함 

4. 책에서 몇개 뽑아볼 것 - 워드프레스는 스킵해도 됩니다. - 거의 다 뽑음

프로그램이나 쓸만한 기능 적어두기 - 메타블로그는 넘겨도 됩니다.

<<넘겨도 되는 것>>

애드센스

메타블로그 

다음뷰

블로그코리아

올블로그

믹시

올포스트


<<적어보는 것>>

RSS

피드버너

구글 분석

윈도우 라이브 에센셜: 어 이건 저장용으로 쓸까 생각중 


유디엠

ㅋㅋㅋㅋ육아용 lilypie.com <- 육아용 dday 밖에 없는거신가 

http://www.timeanddate.com/clocks/freecountdown.html

두개 중에 하나 쓸 것

http://onlineclock.net/ 이것도 되는 거임

오! picpick.org 오 된당 - 색삭 추출 도구 제공


<<해야할 것 같은 느낌>>

Thinktank에 적은 것


오늘도 역시 책은 내도 됩니다. // 지하철에 가면서 좀 더 읽고 색상표좀 빌려오기!

주말에 우쿨 or html&css 보기 


5. 위가 아프니까 집에서 밥을 먹을 것... 라면 x...

그리고 주변 신경 쓰지 말고 공부를 하기 -_-)! 으으으


'Programming' 카테고리의 다른 글

160321: 6회차  (1) 2016.03.21
160318: 5일차  (2) 2016.03.18
160317: 4회차  (3) 2016.03.17
160315: 2회차  (1) 2016.03.15
160314: 1회차  (1) 2016.03.14
Posted by DAVID

160315: 2회차

Programming 2016. 3. 15. 17:16

1. 툴

동일

추가시: 

포스팅 서식 만들었습니다.


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:

구글 계정 생성: bowiejava@gmail.com

(뒤에 앉았을 시 행아웃(lectureblue->community->notice->빅데이터회의 사용)


4. 공부하는 것

method(parameter){

return ㅁㅁ; (메소드를 호출한 곳으로 ㅁㅁ값 반환)

}

parameter와 return값의 변수 타입이 같아야 한다.

변수 타입이 매우 중요하다. (자바 스크립트와 다름)

지역 변수는 메소드 종료시 자동으로 메모리를 해제해준다. (자동으로 저장 공간 반환)


같다: ==

=  ←뜻: 오른쪽 값을 왼쪽으로 담는다.

주석:

한줄: //

여러줄: /* */

문서(API) 주석: /** */

클래스명과 파일명이 같아야 한다.

자바는 main() 메소드부터 실행 시작한다.


식별자 규칙

식별자 이름 자체로 내용 식별 가능해야 한다.

대소문자 구별한다.

한글도 가능하지만 영어 알파벳으로 쓰는 편이 낫겠다.(대소문자 구별)

$랑 _ 는 쓸수 있음.

숫자는 식별자명 두번째 부터 사용 가능(atom1(o) 1atom(x))

예약어는 식별자로 사용 불가(if true false null 등등)

상수: 모두 대문자 (변하지 않는 값 - final 을 사용해서 상수로 선언할 수 있음)

예시: final double PI = 3.14 // 원주율을 상수로 선언

패키지: 모두 소문자

변수:

int a = 10; - 연산자를 중심으로 오른쪽의 데이터(10)가 왼쪽(a)으로 할당된다.

변수 선언시 char c1 = 'a', c2 = 'b'; 이런 식으로 , 써서 여러 개 선언 할 수 있다.

'' ← 기본형 타입          : 'a' 한글자만 가능

'' ← 클래스 타입(참조형) : "hi atom" 장문도 가능

형변환: 우리의친구 (이것도 나중에 형변환 나오면 쓰겠지)

char grade = 'A';

System.out.println("성적: "+ grade); 와 같이 +로 연결하여 출력할 수 있다. // sysout 넘나좋은것

출력값: 성적: A


데이터 타입

요약: 자바의 기본형 타입

숫자형

정수형: byte 1 short 2 int 4 long 8

실수형: float 4 double 8

논리형 (형변환 불가능)

boolean: true false 1

문자형 (short랑 형변환 가능)

char 2


1. 기본형

8가지(정수 4가지 + 실수 2가지 + boolean 타입)

수치 타입: 정수 타입 / 실수 타입(부동 소수점 타입)

정수 타입: byte, short, int, long, (char 얘는 따로 넣는 경우도 있다) ←외우기

byte:     1byte 크기 정수형 

short:    2byte 크기 정수형 

int:      4byte 크기 정수형 (기본값)

long:     8byte 크기 정수형

↑형변환 가능(작은걸 -> 큰거에)

float:     4byte 크기 실수형인데 4byte지만 정수형(long)보다 크다. 

double:  8byte 크기 실수형 (기본값)


boolean: 1byte 크기

char:     2byte 크기 문자형



1. boolean 타입: boolean(끝!)

1byte(8bit) 크기

초기값: false

true랑 false 밖에 못쓴다.

사용 예시: boolean atom = true;

삼항 연산자: 조건식 넣는 boolean 

사용 예시: booleaan b3 = (10>2) ? true : false; // 참일 시 true 거짓일시 false ←사실 이렇게 짜면 에러 메세지 뜸...

 

2. char(문자형)

2byte(16bit) 크기

''(단일 인용부호) 로 문자 하나 표현

\b: 백스페이스

\t: 탭

\n: 라인피드 (Line feed: LF, \n - 줄바꿈을 나타내는 제어문자)

http://zetawiki.com/wiki/개행문자,_라인피드,_캐리지리턴

이렇게 쓰는 것인가 보다. 


\\: 백슬래시(역슬래시 쓰려면 두번 써야 한다)


char ch2 = 65;

System.out.println(ch2); // 하면 유니코드로 출력된다.


3. 숫자형(정수, 실수)

정수형

byte: 1byte (초기값: 0)

값의 범위: -128~127

short: 2byte (초기값: 0)

int: 4byte (초기값: 0) (기본값) // 초기값이 0이긴 한데 왜 not initialized... -_-)

long: 8byte (초기값: 0)

실수형

float: 4byte(초기값: 0.0)

double: 8byte(초기값: 0.0) (기본값)


4byte여도 실수형이 정수형보다 더 커서 강제형변환이 필요하다. 

정수형도 실수형 변수에다가 넣을 수 있는데 10을 넣으면 10.0으로 바뀜


TypeConvension 예제 두번 더 연구해보기

// byte 값: -128~127 // 132 == -124 

//System.out.println((byte)((int)(227)));

byte 값 초과시 프로세스...


2. 참조형 (레퍼런스 타입)

class 타입 

대문자로 시작한다.

변수에 참조값(해쉬코드=레퍼런스 값=실제 데이터의 주소를 가르키는 값)을 가진다.

생성자를 통해서 해시코드를 이해해 보았다.

생성자: new 했을 경우만 메모리를 할당한다.

클래스 obj1 = new 클래스(10,20); // obj1이 해시코드를 가진다 (메모리(객체) 하나당 해시코드 하나)

클래스 obj2 = obj2                //obj2는 obj1이 가리키는 해시코드 값을 가진다.

그래서 System.out.println(obj2.hashCode()); 해보면 obj1거랑 똑같다 


String str = "홍길동"; == String str = new String ("홍길동"); // 이거는 예약어라서 new 이런거 안 해도 됨

그래서 String의 변수는 해시코드를 가지는 것. //해시일까 해쉬일까 hash는 


<<그러니까>>

기본형 변수: 데이터가 들어갈 예정

클래스형 변수: 해쉬코드가 들어갈 예정



인터페이스 타입

배열 타입

열거 타입 ← 내가 만들면 만드는 대로 늘어남.



형변환

double                    (자동 변환)

float                            ↓

long

int

short = char                   ↑

byte               (캐스팅필요=강제형변환)


double 변수 = byte 변수; (형변환 필요x)

short 변수 = long 변수 (형변환 필요o) -> short 변수 = (short) long 변수


float f = 10.5; 라고 했을 때 실수는 무조건 double 형(8byte)으로 들어가니까

float f = 10.5f; 라고 하거나 float f = (float)10.5; 라고 써줘야 4byte로 만들어진다.


클래스 안에 생성된 지역변수는 초기화를 하지 않으면 에러가 뜬다.



<<딱히 어디에 놔야 할 지 모르는 즐거운것>>

print: \n 안들어감 

println: \n 들어감 : 한 줄 아래에 출력됨 


+ 생성자를 체험해 보았다!

생성자 초기화도 코딩해 보았다.

new 키워드도 사용해 보았다.

아 포인터가 아니었슴다 ㅠㅠ - 자바는 포인터가 없음 ★

이름이 그냥 포인트인 클래스인것...★☆

소스 복사해서 그냥 paste 하면 클래스도 만들어줌 -.-);;; ㄷ



<<4장>>

연산자

산술연산자

% 는 a%b -> a를 b로 나눈 나머지

복합대입연산자

+= 는 a+=b -> a= a+b

증감연산자

++랑 --

비교연산자


비트연산자(01연산...)

>> 

>>>

-하면서 봄ㅇㅇ-




변수 = ++i; // 요거는 i를 1증가시킨 후 변수에 할당.

변수 = i++; // 요거는 i를 증가시키기 전에 변수 할당을 하고 ; 를 만날 때 i를 1로 증가시킴 - 그래서 출력하면 변수는 값 안올라있음

변수 = ++변수 // 요렇게는 쓰지 않는걸로  

앞에오면 앞순위 / 뒤에오면 끝순위


<=  // 이거는 작아도 맞고 같아도 맞고

>=  // 이거는 커도 맞고 같아도 맞고

| : or  (둘중 하나라도 참이면 참)

& : and (둘다 같아야 참)

^: Exclusive or (엎 'ㅅ');; XOR : 1개만 참일경우

으으 논리식좀 찾아서 써볼 것...★

<< >>





//음수 2진수 문의가 있는것 - 부호 표시가 어디에 있냐 

//조건문에 숫자 넣을 시 왜 오류가 있을까 - including condition 이라고 하는데 이런 거 안써야 하나?

//  y=x<z ? 3:5; // 오류 x //  y=x<5 ? 3:5; // 오류가 아니라 워닝이뜸


//default method로 설정 된 이유 (default method (package visible) 이렇게 생긴 거가 .java 파일에 뜸)

//class가 public으로 안되있고 그냥 class 클래스명으로 선언되어 있어서... -_-+ (해결...)

//\친구들좀 외울 것

//배열 형식 ㅂㄷㅂㄷ

//hashcode 2번 정도 더 읽어보기

//지역변수는 초기화하지 않으면 기본값 없음. - 나중에 나올것이지만...★

 

5. 수업

그룹별로 나눠서 문제 내서 맞추는 걸로 - 17:00 까지 3개 만들 것 


진도: 

lecture 4 까지?


hw: 

내일은 좀 중간에 앉아보기...

에이씨 문제 많이 틀려서 음료수 사는것 :< 씪씪


6. 부로구

가비아에 문의할 것 - 네임플러스 서비스 - 완료!

오늘 읽은 책에서 몇개 좀 뽑아서 써볼 것 

메타블로그★

다음뷰

네이버 오픈캐스트

그리고 html이랑 css 관련 쪽 내용은 다른 책이었으니 반납 할 것

라이트하고 심플하게 (위젯 좀 안쓰고!) 만들 도안 그려놓기 - 플래시 안 들어가게 빠른 로딩★☆ 위젯도 덜쓰고!!

먹은 것좀 카테고리 만들기 - 90도 사진각 ㅋㅋㅋ 넘나 잘찍는것...



우쿨렐레 모임도 시간 맞으면 갈 것

plan1: 강동역이 아니라 강동구청역이라 fail -> 1시간 무리...

plan2: 종로 모임에 낑긴다! -> 애매함 (이미 시작일로부터 2개월 지나있음)

plan3: 홍대 or 신도림 - 7시 30분에 있는 것들 좀 찾아보기 :> - 주말은 말고! 금요일도 말고! (근데 왜인지 봉사활동이쉰것...)


'Programming' 카테고리의 다른 글

160321: 6회차  (1) 2016.03.21
160318: 5일차  (2) 2016.03.18
160317: 4회차  (3) 2016.03.17
160316: 3회차  (2) 2016.03.16
160314: 1회차  (1) 2016.03.14
Posted by DAVID

160314: 1회차

Programming 2016. 3. 14. 17:21

1. 툴

브라우저: 크롬(추천)

녹화: 반디캠

메모: Editplus(무료판)

개발: Eclipse (Eclipse IDE for Java EE Developers) - JDK의 bit와 맞춥니다. (학원에서 사용하는 버전은 Mars 2)


2. 폴더

D:\javadb

D:\javadb\datadown           다운로드 파일

D:\javadb\eclipse             이클립스

D:\javadb\javasource          자바 소스

D:\javadb\workspace          작업 파일(Eclipse 사용시 default workspace)

D:\javadb\반디캠               녹화 파일


3. 사용할 사이트

1) http://www.lectureblue.pe.kr/ edu0

2) \\172.16.3.249 soldesk

3) http://cloud.naver.com/ my account

4) http://pc-cat.tistory.com/ my account


4. 공부하는 것

소스: 프로그래밍 언어로 작성된 텍스트 파일

컴파일: 소스 파일을 컴퓨터가 이해할 수 있는 기계어로 만드는 과정

플랫폼: CPU + OS


Write Once Run Anywhere

         단 JVM(java virtual machine)이 있는 곳에서

 

byte code (=중간언어(이거 다음에 기계어))

         어떠한 플랫폼에서나 JVM 안에서 동작하는 binary code

 

소스(저장된 코드)         JVM안에서 동작

.java ->                         .class                 ->기계어

                             (바이트코드 = 중간언어)


JDK(Java Development Kit)

= 컴파일러 + JRE(Java Runtime Environment) + 클래스 라이브러리 + etc


자바 클래스 라이브러리 = JAVA API(Java Application Programming Interface)


클래스 or 패키지는 영문으로 짜는 편이 좋다.
Superclass: 최상위 부모클래스 (상속 개념 나올 때 배우는 것이지만) = 단군 클래스
Interface: 실무에서 많이 사용한다.

Eclipse는 save 하면 자동으로 컴파일한다.

외우기: public static void main(String[] ㅁㅁ){}

echo: 도스창에 ㅁㅁ의 값 출력


5. 수업

진도: 

lecture 2

hw: 

JDK setup & environment variable setting 

Tools Setup

소스 복습

'Programming' 카테고리의 다른 글

160321: 6회차  (1) 2016.03.21
160318: 5일차  (2) 2016.03.18
160317: 4회차  (3) 2016.03.17
160316: 3회차  (2) 2016.03.16
160315: 2회차  (1) 2016.03.15
Posted by DAVID
이전페이지 다음페이지
블로그 이미지

by DAVID

공지사항

    최근...

  • 포스트
  • 댓글
  • 트랙백
  • 더 보기

태그

글 보관함

«   2025/08   »
일 월 화 수 목 금 토
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

링크

카테고리

PC (112)
Programming (109)

카운터

Total
Today
Yesterday
방명록 : 관리자 : 글쓰기
DAVID's Blog is powered by daumkakao
Skin info material T Mark3 by 뭐하라
favicon

PC

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • PC (112)
    • Programming (109)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바