ch2 변수 ~ ch07

김민지·2022년 11월 7일
0

자바의정석

목록 보기
2/8

변수

  • 값을 저장할 수 있는 메모리상의 공간
  1. 기본형 : 실제 값을 저장 (boolean, char, byte, short, int, long, float, double)
  2. 참조형 : 값이 저장되어 있는 주소를 값으로 저장

초기화를 해야하는 이유

  • 변수를 선언한 이후부터는 사용할 수 있지만 그전에 반드시 변수를 초기화해야 한다.
  • 메모리는 여러 프로그램이 공유하는 자원이므로 전에 다른 프로그램에 의해 저장된 '알 수 없는 값이 남아있을 수 있기 때문이다.

상수

  • '상수(constant)'는 변수와 마찬가지로 '값을 저장할 수 있는 공간'이지만, 변수와 다르게 한번 값을 저장하면 다른 값으로 변경할 수 없다.
  • final키워드

리터럴

  • int year = 2021;//year는 변수, 2021은 리터럴

단항연산자

전위형: 값이 참조되기 전에 연산 수행
후위형: 값이 참조된 후에 연산 수행

//예제3-2/ch3/OperatorEx2.java
package Chapter03;

public class OperatorEx2 {
    public static void main(String[] args) {
        int i = 5,  j = 0;

        j = i++; //후위 : 값이 참조된 후에 증가시킨다. 쉽게 말하자면 i의 값 5를 j에 넣고 i를 1증가시킨다. 그러면 j는 5, i는 6이다.
        System.out.println("j = i++; 실행 후, i =" + i +", j = " + j);

        i = 5;  // 결과를 비교하기 위해, i와 j의 값을 다시 5와 0으로 변경
        j = 0;

        j = ++i; // 전위 : 값이 참조되기 전에 증가시킨다. 쉽게 말하자면 i의 값 5를 j에 넣기전에 1증가시키고 넣는다. 그러면 j는 6, i는 6이다.
        System.out.println("j = ++i; 실행 후, i =" + i +", j = " + j);
    }
}  //실행결과 :
//j = i++; 실행 후, i =6, j = 5
//j = ++i; 실행 후, i =6, j = 6

기본형, 참조형의 비교연산

  • 기본형의 경우 변수에 저장되어 있는 값이 같은지를 알 수 있고, 참조형의 경우 객체의
    주소 값을 저장하기 때문에 2개의 피연산자(참조 변수)가 같은 객체를 가리키고 있는지 알 수 있다.

switch문

  • switch문은 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 표현도 간결하므로 알아보기 쉽다. 그래서 처리할 경우의 수가 많은 경우에는 if문보다는 switch문으로 작성하는 것이 좋다.

이름붙은반복문

break문은 근접한 단 하나의 반복문만 벗어날 수 있기 때문에, 여러 개의 반복문이 중첩된 경우에는 break문으로 중첩 반복문을 완전히벗어날 수 없다. 이때는 중첩 반복문 앞에 이름을 붙이고. break문과 continue문에 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다.

배열의 초기화

  • 배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화됨

변수의 종류

class Variables
{
	int iv;           //인스턴스변수                            --> 클래스영역
    static int cv;    //클래스변수(static변수, 공유변수)           --> 클래스영역
    
    void method()
    {                 //                       --> 메서드영역
    	int lv = 0;   //지역변수                 -->메서드영역
    }
}

클래스변수: 클래스가 메모리에 올라갈 때, 자동생성, 객체생성필요x, 아무때나사용가능,
인스턴스변수: 인스턴스가 생성되었을 때 객체를 생성해야 사용가능, 객체생성필요
지역변수:

클래스 멤버와 인스턴스 멤버 간의 참조와 호출

  • -> 방향으로 참조하는것은 불가능, <-방향으로 참조는 가능
  • 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만, 클래스멤버가 존재하는 시점에 인스턴스 멤버가 존재하지
    않을 수도 있기 때문

다형성

  • 프로그램 언어 각 요소들(상수, 변수, 식, 객체, 메소드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질

다형성은 프로그램 언어 각 요소들(상수, 변수, 식, 객체, 메소드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질 입니다.
다형성은 오버라이딩이나 오버로딩으로 구현할 수 있죠

  • 오버로딩은 매개변수의 타입이 다른경우 같은이름의 메서드를 중복하여 선언할 수 있는 특성을말하는데요
    메서드인자에 다양한 자료형을 넣을 수 있게 되니 다형성을 구현한다고 할 수 있어요
  • 오버라이딩은 부모의 메서드를 재정의하는것을말하는데요
    하나의 코드로 여러객체를 처리할수있게 돼요
    예를들어 person을 상속받은 female, male은 eat()메서드를 구현해요
    eat이라는 메서드 하나로 female의 eat과 male의 eat모두를 처리할 수 있죠
    그렇기때문에 오버라이딩을 사용한다는것은 다형성을 구현하는게 되는거예요
    Person p = new Female();
    p.eat();
    Person 객체에서 eat을 호출했는데 자식 클래스의 eat 메소드가 호출됐으니까요

다형성의 장점

  • 부모 타입 참조 변수로 자식 타입 객체를 다루는 것
  • 하나의 배열에 여러 종류의 객체 저장
  • 상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있다

instance of

  • instanceof연산의 결과가 true가 나오면 검사한 타입으로 형 변환이 가능하다는 것을 뜻함

상속

  • 상속관계의 부모와자식은 서로 형변환이 가능하다
    자식 타입 -> 부모 타입(up-casting) : 형 변환 생략 가능
    부모 타입 -> 자식 타입(down-casting) : 형 변환 생략 불가

궁금

parent p = new Child()의해석

  • child에 대한 메모리공간을 할당받음
  • 근데 변수의 타입은 parent임
    변수의 타입과 메모리공간을 할당받는 타입이 다름
    각각의 역할이 뭘까요..? 그걸 잘 모르니까 다음과 같은것들이 왜 그런 결과가 나오는지 정확히 설명을 못해요
  1. parent p = new Child()는 되고
    child c = new Parent();는 안되잖아요
  2. Parent p = new Child(); 이것과 Child c = new Child();는 같은 인스턴스를 참조하고 있지만 사용할 수 있는 멤버의 개수에는 차이가 있구요
  3. parent p = new Child(), Child c = new Parent();
    에서 멤버변수의 참조는 다른 값을 가리켜요
    p.x는 부모클래스에 선언된 멤버변수가 사용되고 c.x는 자식클래스에 선언된 멤버변수가 사용돼요
  • 자바는 타입을 명시하는 언어여서 기본적으로 변수를 parent p라고 선언하는 시점에서 p는 parent타입이거나 그 하위

추상클래스

  • 미완성 메서드를 갖고 있는 클래스
    다른 클래스 작성에 도움을 주기 위한 것 / 인스턴스 생성 불가
    상속을 통해 추상 메서드를 완성해야 인스턴스 생성 가능

추상클래스 vs 인터페이스

추상 메서드 : 추상 메서드를 가진 일반 클래스
인터페이스 : 추상 메서드 빼고 구현된 것이 아무것도 없다.

인터페이스

  • 모든 멤버 변수는 public static final이어야 하며, 생략 가능함
  • 모든 메서드는 public abstract 이어야 하며, 생략 가능함
  • 인터페이스는 추상 클래스처럼 그 자체로는 인스턴스(객체)를 생성할 수 없으며, 자신에 정의된 추상 메서드의 몸통을 만들어주는 클래스를 작성해야 함.
  • 일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 한다

인터페이스의 장점

  • 선언과 구현을 분리할 수 있다.
  • 대규모 프로젝트 개발 시 일관되고 정형화된 개발을 위한 표준화가 가능
    https://taesan94.tistory.com/85
    을 참조하면 인터페이스가 왜 결합도를 낮춰주는지 알 수 있다

인터페이스는 결합도를 낮춰줍니다.
공통된 메서드명으로 구현만 다른 female이나 male class가 있다고 가정해요
이 둘을 멤버변수로 갖는 또다른 클래스가 있어요. 근데 만약 인터페이스가 없다면
female,male에 대한 멤버변수를 둘다 가지고 있어야해요(공통속성을 가진 모든 클래스에 대한 멤버변수를 가지고 있어야함)
female, male둘중 무엇을 선택할지 모르니 둘다 가지고 있어야하는거죠
근데 만약에 인터페이스를 사용하면 해당클래스에 타입 하나만 정의해도 간결하게 쓸 수 있어요
해당클래스(female이나 male을 멤버변수로 갖는클래스)를 생성할시점에 male이나 female을 넘겨주면, 즉
그 부분만 변경해주면 female과 male을 쉽게 변경할 수 있는거죠

결합도

  • 수정사항이 생겼을때 100개클래스 모두 수정해야되면 결합도가 높은거고
    1개클래스만 수정해도되면 결합도가 낮은것이다

내부클래스

  • 클래스 내에 선언된 클래스
  • 두 클래스가 서로 긴말한 관계에 있을때 선언
  • 내부클래스에서 외부클래스의 멤버에 쉽게 접근가능
class Outer{
	class InstanceInnerCalss{}
	static class StaticInnerClass{}
	void myMethod(){
		class LocalInnerClass{}	
	}
}

https://doublesprogramming.tistory.com/158


출처
https://backendcode.tistory.com/2

profile
안녕하세요!

0개의 댓글