2020.10.29 일지

0후·2020년 10월 29일
0

비트캠프

목록 보기
9/112

오늘의 요약

1. 변수(Variable) 
   (1) 유효범위 
   (2) 소유( static 여부) 
   (3) 변경( final 여부 ) 
   (4) 메모리 저장방식
	   2) 참조형(레퍼런스)
	      <1> call by reference 
		  <2> 형태: 대문자로 시작 
		  <3> 종류: 기본형(8가지)를 제외한 모든 타입( 무한대 )
		  <4> 초기값: null
		  <5> 형변환 
			ObjectHumanSuperman

	cf) 배열변수
	     -> 배열을 저장하는 변수  
       
2. OOP ( Object Oriented Programming ) 특성
	(1) 상속성( Inheritance ) 
		부모의 '모든 것'을 자식에서 '상속받는 것' (=='사용할 수 있는 것')
		- 다른 생성자가 하나도 없을 경우에만 JVM이 기본생성자(default constructor)를 만들어준다.
		- 자식 객체가 생성되려면 먼저 부모객체가 생성되어야 함
		- 모든 생성자의 첫라인에는 super();가 생략되어 있음 (, 다른 super(..)가 있다면 예외)
		- 모든 객체는 Object의 자식이다. (묵시적 상속) 
			ex) class A extends Object
		- 자식 메소드에서 부모 메소드의 내용을 바꿀 수 있음, =오버라이딩(Overriding)
		* 세상의 어떤 객체라도 Object로 형변환이 가능하다, 왜냐하면 Object는 모든 것이기 때문이다.
		- 형변환은 상속관계에서만 가능
			-> 자동
			-> 강제

	(2) 다형성( Polymorphism )
		같은 타입 객체의 '동일한 메소드가 다른 일을 하는 것(=특성)'
		* 오버라이딩을 함으로써 객체의 다형성을 얻을 수 있다.

	(3) (속성값의)은닉성( Information Hiding )
		속성값(데이터)을 외부 객체로부터 '숨기는 것'
		* 접근제한을 둬야 하는 정보에, private을 속성해주면 정보를 숨길 수 있다.
	
	(4) (메소드의)캡슐화( Encapsulelation )
		- 속성(데이터)과 메서드를 하나로 묶어 외부에 감추기도 하고 보이게도 하는 것
		- 메소드의 형태(리턴타입, 이름, 파라미터)만 알면 그 내용을 몰라도 호출해서 사용할 수 있는 것
        * 내용은 모르면서 이 메소드의 생성자나 형태만 알면 사용할 수 있는 것을 캡슐화라고 한다. ex) 콘택600

A.java (상속성)

class Human {
	String name = "홍길동";
	//Human(){} //default생성자 
	Human(String name){
		this.name = name;
	}
	void move(){
		System.out.println("걷는다");
	}
}
class Superman extends Human {
	int power = 100;
	Superman(){
		super("클락1"); //new Human(String name)
	}
    Superman(String name, int power){
		super(name); //new Human(String name)
		this.power = power;
	}
	void shotLaserBeam(){
		System.out.println("광선을 쏜다");
	}
}

class Manager {
    public static void main(String args[]){
		/*Human h = new Human("이순신");
		System.out.println("h.name: " + h.name);
		h.move();
		System.out.println();*/

		Superman sm = new Superman("클락2", 200);
		System.out.println("sm.name: " + sm.name);
		sm.move();
		System.out.println("sm.power: " + sm.power);
		sm.shotLaserBeam();
	}
}
  1. 메소드는 무조건 동사형태로 사용할 것
  2. 상속을 하는 이유는 다음과 같다.
    • 한번 짠 코딩을 다음에 또 짜지 않게 하기 위해서 (==중복을 줄여준다.)
    • 부모의 것을 사용하여 효율적인 코드를 짜기 위해서

Man.java

class Man {
	int age;
	int height;
	int weight;

/* 
	Man(){} // 1) 기본생성자일 때 
	void setAge(int age){
		this.age = age;
	}
	void setHeight(int height){
		this.height = height;
	}
	void setWeight(int weight){
		this.weight = weight;
	} // 1) 기본생성자일 때 
	// 파라미터 변수를 사용하게 되면 현재는 업무로직상 필요 없는 것처럼 보이나 해당 내용을 미리 만들어두면,
	// 나중에 값을 변경하고 싶을 때 사용하므로 미리 만들어두는 편이 좋다. 
*/
	int getAge(){
		return age;
	}
	int getHeight(){
		return height;
	}
	int getWeight(){
		return weight;
	}

	Man(int age, int height, int weight){
		this.age = age;
		this.height = height;
		this.weight = weight;
	}
}

class ManMgr{
	public static void main(String[] args){
		/*
		Man m = new Man();
		m.setAge(20);
		m.setHeight(185);
		m.setWeight(85); // 1) 기본생성자일 때 
		*/

		Man m = new Man(22, 188, 75); // 2) 파라미터 변수를 가져올 때

		System.out.println("age: " + m.getAge()); // 2) 파라미터 변수를 가져올 때
		System.out.println("height: " + m.getHeight()); // 2) 파라미터 변수를 가져올 때
		System.out.println("weight: " + m.getWeight()); // 2) 파라미터 변수를 가져올 때
	}
}

에러(Error)

Exception in thread "main" java.lang.ClassCastException
쓰레드 "main"java.lang.ClassCastException의 예외

  • 오늘 있는 상황에서는 개발자에 의해 잘못된 강제형변환을 해서 컴파일은 되나, 실행은 되지 않는 현상이다. 지금 아직 배우지 않은 개념이 많아서 이 에러를 잡을 만한 개념은 나중에 알아봐야겠다.

자바에 관한 여러가지 이야기

  1. 아무것도 없는 자바파일에서는 멤버변수 0개, 생성자 1개, 메소드 11개가 기본으로 있다. 객체의 근본적인 개념에서는 멤버변수, 생성자, 메소드가 아예 없는 게 맞는건데, 우리의 객체는 디바이스에 묶이기 때문에 이 정도를 기본으로 가지고 있는 것이다.
  2. 모든 클래스의 조상은 object임 ex) class b extends object
  3. autoboxing을 하는 이유는 wrapper class의 메소드나 멤버 변수를 사용하기 위해서이다. 컬렉션에 저장하려고 하는 이유도 크다. 컬렉션에는 기본형을 저장할 수 없고, 오브젝트는 사칙연산이 안되기 때문에, 꼭 박싱을 해서 바꿔줘야 한다. => 이 부분 더 깊은 이해 필요함
profile
휘발방지

0개의 댓글