Sad Puppy 3 개발자 아지트 :: 개발자 아지트

1. CSS 크로스 브라우징 해보기

 

CSS 크로스 브라우징 툴인 autoprefixer(https://autoprefixer.github.io)을 사용해서 CSS가 어떻게 바뀌는지 확인해 본다. 

 

git에 따르면, 이걸 npm으로 설치할 수 있어서 brew, npm, nvm으로 설치하고 cli명령어 쳐서 해봤는데 아무일도 일어나지 않았다. 찾아보니까 html파일안에 css코드가 있는 경우 적용이 안된다. 그래서 html코드랑 css코드를 분리했다. 

 

autoprefixer을 실행해봤다. build라는 폴더가 생기고 그 안에 style.css가 생겼다. 



바로 기존 코드와 새로 생긴 코드를 비교해보겠다. 

적용전



적용후

 

 

 음 일단 내 코드에서는 너무 평이한 기능들만 사용해서인지 22번째줄에 주석 말곤 달라진점이 없다.

다음에 기회가 된다면 다음에 한번 더 써봐야겠다. 

 

 

2. 자바스크립트 크로스 브라우징 해보기 

 

Transpiler를 사용해 보고, 자바스크립트 코드가 어떻게 바뀌는지 확인해보기 

Transpiler는 호환성에 맞게해주는 변환기를 말한다. (compiler 같은 기계임)

 

주로 쓰는 Transpiler는 babel과 TypeScript가 있다. 

 

이번에 나는 Babel을 사용해보겠다. 

 

이것도 html안에 script코드가 있으니 적용이 안돼서 app.js파일로 따로 script코드를 분리해줬다. 

 

babel 명령어를 실행하니 dist라는 폴더가 생기고 안에 app.js가 생겼다. 

 

 

 

바로 코드를 비교해보겠다. 

 

변경전 후 코드 확인해보기 

 

확실히 제대로 바뀌는것 같다. ES6이하로 바뀐것을 확인할 수 있다.

 

 

근데 var 위험하다고 선생님이 쓰지말라고 하셨는데,,

 

 

얘가 템플릿 리터럴도 해제시켜버렸다.

 

 

 

전체 코드 비교해보기 

더보기

 

[기존코드]

// window.onload = function(){ ES6 적용전 코드 
window.onload = () =>{ // ES6 적용 코드 
    // 페이지 로드시 localStorage에서 값을 가져와서 출력 
    // 동일한 기능을 하는 걸 함수로 묶어서 개발하는게 좋다. 
    // 나중에 개발하고나서 코드 리뷰를 하면면서 함수 묶으면 좋음
    try {
        // Array.isArray
        let todo = JSON.parse(localStorage.getItem('todo')) || [];
        let check = 0
        // todo값이 배열인지 아닌지만 확인하는 코드도 추가돼야 할거같음 
        if (Array.isArray(todo) == true){
            // 아래는 배열 순회 코드 
            for(let key in todo){
                // key 의 타입은 String 임 
                if ((typeof todo[key] != "undefined") && (todo[key].length > 0)){
                    if ((typeof todo[key] != "undefined") && (todo[key].length > 0)){
                        check = 0;
                    }else{
                        check = 1;
                    }
                }
            }
            if (check == 0){
                displayArray(todo);
            }else{
                console.error('정상적인 접근이 아닙니다.');
            }
        }else{
            console.error('정상적인 접근이 아닙니다.');
        }
        
    } catch (error) {
        console.error('Error parsing JSON from localStorage:', error.message);
        // 이 경우에는 새로운 배열로 초기화할 수 있음
        let todo = [];
        displayArray(todo);
    }
}

function showValue() {
    let inputValue = document.getElementById('inputData').value;
    console.log('inputValue:', inputValue);
    
    let inputLength = inputValue.length;
    
    // 로컬스토리지에서 'todo' 키로 저장된 배열 가져오기 
    let storedArray = JSON.parse(window.localStorage.getItem('todo')) || [];

    let maxLength = 0;

    storedArray.forEach((item, index, storedArray) => {
        if (maxLength < item.length){
            maxLength = item.length;
            console.log('maxLength: ', maxLength);
        }
    });

    let container = document.querySelector('.container');

    if (inputLength >= maxLength){
        container.style.width = `${80 + (inputLength * 10)}px`;
    }else{
        container.style.width = `${80 + (maxLength * 10)}px`;
    }

    container.style.height = `80 + ${(storedArray.length+1) * 20}px`;
    console.log('storedArray:', storedArray);
    
    // 입력값을 배열에 추가함
    storedArray.push(inputValue)

    // localStorage에 값을 저장 
    window.localStorage.setItem('todo', JSON.stringify(storedArray));

    // 입력 필드 초기화 
    document.getElementById('inputData').value = '';

    // 배열 화면에 출력
    displayArray(storedArray);
}

function displayArray(array){
    console.log('displayArray');
    let list = document.getElementById('todoList');
    list.innerHTML = ''; // 기존 리스트 초기화 

    let maxLength = 0;
    
    for(let i = 0; i < array.length; i++){
        if (maxLength < array[i].length){
            maxLength=array[i].length;
            console.log('maxLength: ', maxLength);
        }
    }
    // css에서 클래스 지정하는 함수 
    let container = document.querySelector('.container');
    
    // 삭제하는 기능

    // 템플릿 리터럴 적용
    container.style.width = `${450 + (maxLength * 10)}px`;
    container.style.height = `${80 + ((array.length+1) * 20)}px`;
    
    console.log('array:', array);

    array.forEach(function(item, index){
        // 새로운 리스트 아이템 생성  
        let listItem = document.createElement('li'); 
        // li를 만들고 이를 참조하는 리스트 생성
        let checkbox = document.createElement('input');
        checkbox.type = "checkbox";
        

        let label = document.createElement('label');
        label.textContent = item;

        let deleteButton = document.createElement('button');
        deleteButton.type = "button";
        deleteButton.classList.add('deleteButton');
        deleteButton.textContent = 'x';
        deleteButton.addEventListener('click', function(){
            deleteValue(index);

        });

        listItem.appendChild(label)
        listItem.appendChild(checkbox)
        listItem.appendChild(deleteButton)
        // 리스트에 추가 
        list.appendChild(listItem);
    });
}

function deleteValue(index){

    console.log('hi', index);
    let storedArray = JSON.parse(window.localStorage.getItem('todo')) || [];
    storedArray.splice(index, 1);
    window.localStorage.setItem('todo', JSON.stringify(storedArray));
    displayArray(storedArray);

}

 

 

[babel을 통해 변경된 코드]

"use strict";

// window.onload = function(){ ES6 적용전 코드 
window.onload = function () {
  // ES6 적용 코드 
  // 페이지 로드시 localStorage에서 값을 가져와서 출력 
  // 동일한 기능을 하는 걸 함수로 묶어서 개발하는게 좋다. 
  // 나중에 개발하고나서 코드 리뷰를 하면면서 함수 묶으면 좋음
  try {
    // Array.isArray
    var todo = JSON.parse(localStorage.getItem('todo')) || [];
    var check = 0;
    // todo값이 배열인지 아닌지만 확인하는 코드도 추가돼야 할거같음 
    if (Array.isArray(todo) == true) {
      // 아래는 배열 순회 코드 
      for (var key in todo) {
        // key 의 타입은 String 임 
        if (typeof todo[key] != "undefined" && todo[key].length > 0) {
          if (typeof todo[key] != "undefined" && todo[key].length > 0) {
            check = 0;
          } else {
            check = 1;
          }
        }
      }
      if (check == 0) {
        displayArray(todo);
      } else {
        console.error('정상적인 접근이 아닙니다.');
      }
    } else {
      console.error('정상적인 접근이 아닙니다.');
    }
  } catch (error) {
    console.error('Error parsing JSON from localStorage:', error.message);
    // 이 경우에는 새로운 배열로 초기화할 수 있음
    var _todo = [];
    displayArray(_todo);
  }
};
function showValue() {
  var inputValue = document.getElementById('inputData').value;
  console.log('inputValue:', inputValue);
  var inputLength = inputValue.length;

  // 로컬스토리지에서 'todo' 키로 저장된 배열 가져오기 
  var storedArray = JSON.parse(window.localStorage.getItem('todo')) || [];
  var maxLength = 0;
  storedArray.forEach(function (item, index, storedArray) {
    if (maxLength < item.length) {
      maxLength = item.length;
      console.log('maxLength: ', maxLength);
    }
  });
  var container = document.querySelector('.container');
  if (inputLength >= maxLength) {
    container.style.width = "".concat(80 + inputLength * 10, "px");
  } else {
    container.style.width = "".concat(80 + maxLength * 10, "px");
  }
  container.style.height = "80 + ".concat((storedArray.length + 1) * 20, "px");
  console.log('storedArray:', storedArray);

  // 입력값을 배열에 추가함
  storedArray.push(inputValue);

  // localStorage에 값을 저장 
  window.localStorage.setItem('todo', JSON.stringify(storedArray));

  // 입력 필드 초기화 
  document.getElementById('inputData').value = '';

  // 배열 화면에 출력
  displayArray(storedArray);
}
function displayArray(array) {
  console.log('displayArray');
  var list = document.getElementById('todoList');
  list.innerHTML = ''; // 기존 리스트 초기화 

  var maxLength = 0;
  for (var i = 0; i < array.length; i++) {
    if (maxLength < array[i].length) {
      maxLength = array[i].length;
      console.log('maxLength: ', maxLength);
    }
  }
  // css에서 클래스 지정하는 함수 
  var container = document.querySelector('.container');

  // 삭제하는 기능

  // 템플릿 리터럴 적용
  container.style.width = "".concat(450 + maxLength * 10, "px");
  container.style.height = "".concat(80 + (array.length + 1) * 20, "px");
  console.log('array:', array);
  array.forEach(function (item, index) {
    // 새로운 리스트 아이템 생성  
    var listItem = document.createElement('li');
    // li를 만들고 이를 참조하는 리스트 생성
    var checkbox = document.createElement('input');
    checkbox.type = "checkbox";
    var label = document.createElement('label');
    label.textContent = item;
    var deleteButton = document.createElement('button');
    deleteButton.type = "button";
    deleteButton.classList.add('deleteButton');
    deleteButton.textContent = 'x';
    deleteButton.addEventListener('click', function () {
      deleteValue(index);
    });
    listItem.appendChild(label);
    listItem.appendChild(checkbox);
    listItem.appendChild(deleteButton);
    // 리스트에 추가 
    list.appendChild(listItem);
  });
}
function deleteValue(index) {
  console.log('hi', index);
  var storedArray = JSON.parse(window.localStorage.getItem('todo')) || [];
  storedArray.splice(index, 1);
  window.localStorage.setItem('todo', JSON.stringify(storedArray));
  displayArray(storedArray);
}

 

 

 

 

 

HTML이 웹 표준에 맞춰 작성 돼있나?

 

웹페이지를 만든후, 배포하기 위해서는 웹 표준검사와 웹접근성 검사가 필요하다. 이를 위해서 아래의 도구를 위해 웹 표준 검사를 해보도록 하겠다. 

 

 

HTML 표준 검사 도구를 활용해 확인 해보기

 

 

 

나도 임시로 만든 html 코드를 넣어봤다. 찾아보니 잘못된 위치에 닫는 코드가 있다고 문제가 된다고 했다.

HTML 표준에 따라 input태그는 자체 닫힘 태그이므로 <input>또는 <input /> 형태로 쓰여야 한다고 한다.
그래서 닫는태그를 아래와 같이 변경후 다시 코드를 체크했다.

 

 

 

다시 돌렸다. 

 

 

다시 좀 찝찝한 결과가 나왔다. 확인해보니 input태그 뒤에 슬래시도 없애도 별 문제가 없다고 한다.

뒤의 슬래시를 제거후 다시 코드를 체그해봤다.

 

결과는 성공이다 ! 

 

 

 

CSS 코드 중 다른 브라우저에서 지원하지 않는 코드가 있는지 확인해보기 

Can I Use 에서 내가 사용한 코드가 어디까지 지원하는지 확인할 수 있다.  

 

Can I use... Support tables for HTML5, CSS3, etc

 

caniuse.com

 

 

 

 

해당 페이지에서 사용하길 원하는 css 기능을 입력해보면된다. (나는 아직 이렇다할 css기능을 사용하지 않아서 별건없다. )

 

 

해당 기능이 이렇게 다양한 브라우저에서 지원하고 있음을 알 수 있다. 

 

 

자바스크립트 코드 중 다른 브라우저에서 지원하지 않는 코드가 있는지 확인해보기 

 

W3Schools.com

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

'Domain > Web' 카테고리의 다른 글

쿼리 스트링(Query String)  (0) 2024.08.03
브라우저 호환성 문제 해결을 위한 크로스 브라우징  (0) 2024.07.10

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals

 

Template literals - JavaScript | MDN

템플릿 리터럴은 내장된 표현식을 허용하는 문자열 리터럴입니다. 여러 줄로 이뤄진 문자열과 문자 보간기능을 사용할 수 있습니다. 이전 버전의 ES2015사양 명세에서는 "template strings" (템플릿 문

developer.mozilla.org

 

템플릿 리터럴은 내장된 표현식을 허용하는 문자열 리터럴이다. 

문자열 내에서 표현식을 포함한다. 따라서 여러줄의 문자열을 보다 간편하게 작성할 수 있게 해준다. 

템플릿 리터럴은 백틱(backtick, `)문자로 싸여 사용된다. 

(맥북에서 백틱을 출력하려면 키보드 표현을 영어로 전환하고 ₩를 누르면 출력할 수 있다. )

 

기본 문법

let text = `Hello, World!`;
 

특징

1. 다중 줄 문자열 (Multi-line Strings)

let multiLine = `This is
a string
that spans multiple lines.`;

console.log(multiLine);

 

 

템플릿 리터럴을 사용하면 여러 줄의 문자열을 쉽게 작성할 수 있다. 

 

2. 표현식 삽입 (Expression Interpolation)

 

${} 구문을 사용하여 문자열 내에 표현식을 삽입할 수 있다.

let name = 'Alice';
let greeting = `Hello, ${name}!`;

console.log(greeting); // Hello, Alice!
 

 

표현식 내에서는 JavaScript의 모든 유효한 표현식을 사용할 수 있다. 

아래는 숫자와 문자가 혼합된 경우이다. 

let a = 5;
let b = 10;
let sum = `The sum of a and b is ${a + b}.`;

console.log(sum); // The sum of a and b is 15.

 

 

 

3. 태그된 템플릿 리터럴 (Tagged Template Literals)

 

태그 함수(tag function)를 사용하여 템플릿 리터럴을 처리할 수 있다. 태그 함수는 템플릿 리터럴의 각 부분과 표현식을 인수로 받아 처리한다. (템플릿 리터럴에 태그 함수를 붙여서 문자열과 삽입된 표현식을 가공하는 기능임)

 

태그함수는 두 종류의 인수를 받는다. 

 

1. 문자열 리터럴 부분들을 배열로 받는다. 

2. 표현식 부분들을 순서대로 받는다. 

 

function tag(strings, ...expressions) {
    console.log(strings); // ['Hello, ', '! How are ', ' today?']
    console.log(expressions); // ['Alice', 'you']
    return `${strings[0]}${expressions[0]}${strings[1]}${expressions[1]}${strings[2]}`;
}

let name = 'Alice';
let tagResult = tag`Hello, ${name}! How are ${'you'} today?`;

console.log(tagResult); // Hello, Alice! How are you today?

 

 

4. 중첩된 템플릿 리터럴 (Nested Template Literals)

 

템플릿 리터럴은 중첩해서 사용할 수 있습니다.

 

let nested = `This is ${`a nested ${`template literal`}`}.`;

console.log(nested); // This is a nested template literal.

 

예제

1. 다중 줄 문자열

let multiLine = `This is a
multi-line string.`;

console.log(multiLine);
// 출력:
// This is a
// multi-line string.

 

2. 표현식 삽입

let name = 'Bob';
let age = 30;
let greeting = `Hello, my name is ${name} and I am ${age} years old.`;

console.log(greeting); // Hello, my name is Bob and I am 30 years old.

 

3. 태그 함수 사용

function emphasize(strings, ...values) {
    return strings.reduce((result, str, i) => `${result}${str}<strong>${values[i] || ''}</strong>`, '');
}

let name = 'Charlie';
let message = emphasize`Hello, ${name}! Welcome to our site.`;

console.log(message); // Hello, <strong>Charlie</strong>! Welcome to our site.
 

 

템플릿 리터럴은 가독성을 높이고, 다중 줄 문자열과 동적인 문자열 생성을 더욱 쉽게 만들어주는 강력한 기능을 제공한다. JavaScript에서 문자열 작업을 할 때 매우 유용한 도구다.

기존에 자바스크립트로 작성한 코드에서 ES6표준을 따르는 코드로 바꾸고 싶어서 ES6에 대해서 찾아보다가 화살표 함수가 뭔지 알게됐다.  이번 글에서는 화살표 함수에 대해서 정리해보려고 한다. 


JavaScript의 화살표 함수(arrow function)는 ES6(ECMAScript 2015)에서 도입된 간결한 문법의 함수 표현식이다. 화살표 함수는 기존 함수 선언보다 코드가 짧아지고, this 키워드의 동작이 달라지는 등의 특징이 있다. 다음은 화살표 함수에 대한 설명과 예제이다.

 

 

문법

 

화살표 함수는 다음과 같은 문법으로 작성된다.

(param1, param2, ..., paramN) => { statements }

 

 
매개변수가 하나뿐이라면 괄호를 생략할 수 있다. 
  
param => { statements }
 

 

반환 값이 있는 단일 표현식의 경우 중괄호와 return 키워드를 생략할 수 있다.

 

(param1, param2) => expression

 

 

예제

1. 기본 사용법

// 전통적인 함수 표현식 
let add = function(x, y) {
	return x + y; 
}; 
    
// 화살표 함수 표현식 
let add = (x, y) => {
	return x + y; 
}; 
    
// 표현식으로 반환하는 경우 중괄호와 return 생략 
let add = (x, y) => x + y; 

console.log(add(2, 3)); // 5

 

2. 매개변수가 하나일 때 괄호 생략

let square = x => x * x;
console.log(square(4)); // 16
 

3. 매개변수가 없을 때

var greet = () => 'Hello';
console.log(greet()); // 'Hello'

 

특징

1. this 바인딩

화살표 함수는 자신만의 this 바인딩을 가지지 않는다. 대신, 화살표 함수는 상위 스코프의 this를 캡처한다. 이는 특히 콜백 함수 내부에서 유용하다.

 

function Person() {
    this.age = 0;

    setInterval(() => {
        this.age++; // this는 Person 객체를 참조합니다
        console.log(this.age);
    }, 1000);
}

var person = new Person();
 

위 예제에서 setInterval 내부의 화살표 함수는 Person 객체의 this를 캡처하여 사용한다.
전통적인 함수 표현식을 사용했다면 this가 window 객체를 참조하게 된다.

 

2. arguments 객체 없음

화살표 함수는 arguments 객체를 가지지 않는다.

대신 나머지 매개변수(rest parameters)를 사용해야 한다.

var sum = (...args) => args.reduce((a, b) => a + b, 0);
console.log(sum(1, 2, 3, 4)); // 10

 

3. 생성자 함수로 사용 불가

 

화살표 함수는 생성자 함수로 사용할 수 없다. new 키워드와 함께 사용할 수 없다.

var Foo = () => {};
var foo = new Foo(); // TypeError: Foo is not a constructor
 

 

화살표 함수는 간결한 문법과 this 바인딩의 특수성 덕분에 특히 콜백 함수나 간단한 함수 표현식에 유용하게 사용된다. 그러나 생성자 함수나 arguments 객체가 필요한 경우 전통적인 함수 표현식을 사용해야 한다.

자바스크립트 ECMAScript6(ES6)은 최신 표준 버전을 말한다. 

해당 버전에는 다음과 같은 기능들이 포함되어있다. 

  • const and let Arrow
  • functions(화살표 함수)
  • Template Literals(템플릿 리터럴)
  • Default parameters(기본 매개 변수) 
  • Array and object destructing(배열 및 객체 비구조화)
  • Import and export(가져오기 및 내보내기)
  • Promises(프로미스)
  • Rest parameter and Spread operator(나머지 매개 변수 및 확산 연산자) 
  • Classes(클래스)

 

 

  • 자바스크립트에서 배열인지 확인하는 코드 작성하는 방법 
Array.isArray(obj) // 반환값은 boolean값이다. 객체가 배열인 경우 true, 아닌경우 false를 반환

 

  • for each 문

(기본 형태)

array.forEach(element => {
                    
});


array.forEach((item, index, array) => {
                    
});

 

  • 데이터 타입 확인하기 위한 함수
typeof(operand) // 반환값은 operand의 타입 값을 반환함

 

 

  • let과 const의 공통점
    • 변수를 선언할 때 사용하는 키워드이다. 
    • 블록 스코프를 가지므로, 블록 외부에서는 접근할 수 없다. 
    • 호이스팅 되지만, 초기화 되기전에 접근할 수 없다. 
    • 동일 스코프 내에서 중복 선언이 불가능하다. 
    • 전역 스코프에서 전역 객체의 속성이 될 수 없다. 
  • let과 const의 차이점
    • let: 언제든 내용물을 바꿀 수 있는 변수
    • const: 상수 
  • var을 사용하면 안되는 이유
    • 코드의 가독성과 예측성, 잠재적 버그를 피하기 위함
    • var을 사용했을때 발생할 수 있는 문제
      • var는 함수 스코프를 가지므로 블록 외부에서도 접근이 가능하다. 이로 인해 스코프의 예측이 불가능하다.
      • var로 선언된 변수는 호이스팅이 되어 선언전에 접근할 수 있다. 이로인해 초기화되지 않은 변수를 사용할 경우, 버그가 발생한다. 
      • var로 선언된 변수는 동일한 스코프 내에서 여러번 선언할 수 있다. 이는 코드의 예측가능성을 낮추고 실수 유발의 가능성을 만든다. 
      • 전역 스코프에서 전역 객체의 속성이 될 수 있다. 이는 예상치 못한 상호작용을 초래할 수 있다. 
  • JSON.stringify()을 사용하면 대상을 JSON 문자열로 변환할 수 있다. 
  • window.localStorage.setItem을 사용하면 해당 위치에 데이터를 저장할 수 있다. 
  • JSON.parse()를 이용하면 자동으로 JSON 문자열을 자바스크립트 객체로 변환해준다.

자바에서는 함수를 메서드라 한다. 

 

public class Method1{
	public static void main(String[] args) {
    
    	int a = 1;
        int b = 2;
        
        int sum = a + b;
    	int sum 2 = add(10, 20);
    }
    
    public static int add(int a, int b){ // 선언부
    	int sum = a + b;  // 본문 시작
        return sum;
    }
}

 

모든 메서드는 return을 호출해야한다. 

반환타입이 void인 경우에는 return이 생략가능하다. (자바가 알아서 return을 넣어준다.)

 

return문 만나면 즉시 함수를 빠져나간다. 

 

함수의 반환값이 있어도 반환값을 안받고 무시도 가능하다. 

(void는 받으면 안됨)

 

함수 이름은 동사로 시작 시킴 

 

 

단축키:  함수이름 누르고 command + b하면 해당 함수로 이동함

 

함수 호출시 메모리공간이 할당됨

함수 실행 끝나면 사라짐 

 

인수(Argument) == 인자

호출할 때 넘기는 값. 즉, 내부로 들어가는 값

매개변수(Parameter)

메서드 정의 시 선언한 변수를 말함

넘어오는 값을 중간에서 전달하는, 매개하는 변수

메서드 내부에서 사용할 수 있는 변수

 

메서드 호출 및 값 전달 

 

자바는 항상 변수의 값을 복사해서 대입한다. 

 

 

메서드 형변환

 

메서드를 호출할 인자와 매개변수의 타입이 맞지 않는경우에 형변환이 필요하다.

타입이 다른경우에는 자동 형변환이 가능한 경우(인자 타입이 함수의 매개변수 타입보다 작은 타입인 경우)에만 호출이 가능하다. 

public class Casting{
	public static void main(String[] args){
    	int number = 100;
        printNum(number); // 인자로 넘김 
    }
    
    public static void printNum(double n){// 매개변수로 받음, 자동형변환됨 int -> double
    	System.out.println(n);
    }
}

 

 

메서드 오버로딩

 

함수 이름이 같고 매개변수가 다른(매개변수의 순서와 타입이 다른경우) 메서드를 여러개 정의하는 것을 메서드 오버로딩(Overloading)이라 한다. 

(Overloading의 의미: 과하게 물건을 적재했다)

(반환 타입만 다른 경우는 취급하지 않는다. )

==메서드 시그니처(메서드를 구분할 수 있는 기준)

 

int plus(int a, int b)
int plus(int c, int d)

// 위와 같은 경우도 취급하지 않는다.

 

자기 타입에 맞는 메서드를 찾아서 실행해되, 없는 경우에는 형 변환 가능한 타입의 메서드를 찾아서 실행함 

 

 

 

코드를 메서드를 사용하는 식으로 리펙토링을 하면 main()은 상세 코드가 아닌, 전체 구조(목차같은 느낌)를 한눈에 볼 수 있게 되는 모습으로 된다. (모듈처럼 만들어두는 모습) 이런 리펙토링을 메서드 추출(Extract Method)라고 한다. 꼭 재사용 하지 않더라도 보기좋게 하기 위해서 리펙토링을 진행한다. 

 

 

 

 

 

'Java > Java입문' 카테고리의 다른 글

배열  (0) 2024.07.05
사용자 입력  (1) 2024.07.05
스코프(변수의 접근 가능 범위), 형변환  (0) 2024.07.05
반복문  (0) 2024.07.05
조건문  (0) 2024.07.05

기본형(Primitive Type) : 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입

참조형(Reference Type) : 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입

 

배열과 객체, 클래스를 담는 변수 등은 참조형에 속함.

 

 

배열은 동적으로 사이즈를 변경할 수 있다. 

코드가 실행되는 시점에 배열의 크기가 정해지기 때문이다. 

예를 들면, 사용자 입력을 받아 배열의 크기를 설정할 수 있다. 

 

기본 형태

	public class Array1{
    	public static void main(String[] args){
        	int[] team; // 배열 변수 선언
            teams = new int[4]; // 배열 생성
        }
    
    }

 

	public class Array1{
    	public static void main(String[] args){
        	int[] team; // 배열 변수 선언
            teams = new int[]{1, 2, 3, 4}; // 배열 생성
        }
    
    }

 

	public class Array1{
    	public static void main(String[] args){
        	int[] team = new int[]{1, 2, 3, 4}; // 배열 생성
        }
    
    }

 

 

	public class Array1{
    	public static void main(String[] args){
        	int[] team = {1, 2, 3, 4}; // 배열 생성
        }
    
    }

 

리펙토링 :

기존 코드의 기능은 유지하면서 내부 구조를 개선하는 것을 말함.

(중복 제거, 복잡성을 줄이기, 이해하기 쉬운 코드로 다시 작성)

 

 

2차원 배열

 

arr[행][열] 

 

	public class Array1{
    	public static void main(String[] args){
        	int[][] team = new int[2][3]; // 배열 생성
        }
    
    }

 

 

 

	public class Array1{
    	public static void main(String[] args){
        	int[][] team = new int[2][3]{
                {1, 2, 3},
                {4, 5, 6}    
            }; // 배열 생성
        }
    }

 

 

향상된 for 문

코드가 간결하고 가독성이 좋음

public class test{
	public static void main(String[] args){
    int[] numbers = {1, 2, 3, 4, 5};
    
 	for (int number : numbers){
    	System.out.println(number);
    }
    }

}

 

(단축키 - iter) 

'Java > Java입문' 카테고리의 다른 글

메서드  (0) 2024.07.05
사용자 입력  (1) 2024.07.05
스코프(변수의 접근 가능 범위), 형변환  (0) 2024.07.05
반복문  (0) 2024.07.05
조건문  (0) 2024.07.05

 


import java.util.Scanner;

public class Scanner1 {
	public static void main(String[] args){
    	Scanner scanner = new Scanner(System.in);
        
        String str = scanner.nextLine(); // 사용자 입력을 받는 부분
        // 엔터를 입력할 때 까지 문자를 가져옴 
        
        
        int intValue = scanner.nextInt(); // 정수값을 사용자 입력으로 받는 부분
        
        
        double doubleValue = scanner.nextDouble(); // 입력을 double로 받는 부분
        
        
    }

}

 

 

print() 다음 라인으로 넘기지 않는다. 

println() 다음 라인으로 넘긴다. 

 

 

'Java > Java입문' 카테고리의 다른 글

메서드  (0) 2024.07.05
배열  (0) 2024.07.05
스코프(변수의 접근 가능 범위), 형변환  (0) 2024.07.05
반복문  (0) 2024.07.05
조건문  (0) 2024.07.05

변수의 종류

변수의 종류는 변수 선언 위치에 따라 아래와 같이 나뉜다. 

지역변수, 멤버 변수(클래스 변수, 인스턴스 변수)

 

지역변수

지역 변수는 특정 지역에서만 사용할 수 있는 변수이며, 지역은 코드 블록을 말한다. 

자신이 선언된 블록 외에서 자신에게 접근하려고 하면 접근할 수 없다. 

ex) if 문 안에서 선언한 변수는 if문 안에서만 사용할 수 있다. 

왜 지역 변수인가? 자신의 지역 안에서만 생존할 수 있기 때문이다. 

 

스코프의 표현

스코프 범위가 길다. 

스코프가 범위가  짧다. 

 

스코프는 왜 필요한가?

  • 비효율적인 메모리 사용을 막기 위함
  • 코드 복잡성을 낮추기 위함 
    • 좋은 코드는 군더더기 없는 단순한 코드임 
  • 좋은 프로그램은 무한 자유가 있는 프로그램이 아닌 적절한 제약이 있는 프로그램이다.

 

형변환(캐스팅)

 

(cast-다른 물질을 녹여 특정 형태나 모양을 만드는 과정)

작은 범위에서 큰 범위로의 값은 허용함

이때, 사용자가 타입을 맞춰주지 않는 경우에는 자바에서 자동으로 형변환을 해줌(묵시적 형변환)

 

큰 범위의 값을 작은 범위로의 대입은 명시적 형변환이 필요하다. \

이때, 오버플로우 및 소수점 버림을 유의하고, 명시적 형변환을 사용하도록 해야한다.  

(명시적 형변환을 한다 하더라도 형변환 하기전의 변수값과 타입은 유지된다. )

 

 

타입의 범위 

 

int < long < double

 

자바에서의 계산

 

같은 타입끼리의 계산은 같은 타입의 결과를 나타낸다. 

 

서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다. 

 

 

 

 

 

 

 

 

 

 

 

 

'Java > Java입문' 카테고리의 다른 글

배열  (0) 2024.07.05
사용자 입력  (1) 2024.07.05
반복문  (0) 2024.07.05
조건문  (0) 2024.07.05
연산자  (0) 2024.07.05

+ Recent posts