본문 바로가기

CSS에서 클래스(.class)와 아이디(#id)의 차이를 감으로 이해하기

📑 목차

    CSS 클래스(.class)와 아이디(#id) 감으로 이해하기

    웹 페이지를 만들 때, 우리는 다양한 요소를 배치하고 각 요소에 예쁜 옷을 입히는 작업을 합니다. 이때 옷을 입히는 과정이 바로 CSS 스타일링이고, 어떤 요소에 어떤 옷을 입힐지 지정하는 방법이 바로 '클래스(class)'와 '아이디(id)'를 사용하는 것입니다. 이 둘의 차이를 명확히 이해하면 웹 페이지를 훨씬 효율적이고 유연하게 디자인하고 관리할 수 있습니다. 마치 옷장 정리를 할 때 어떤 옷은 '데일리룩'으로 묶고, 어떤 옷은 '특별한 날'을 위해 하나만 보관하는 것과 비슷하다고 할 수 있습니다.

    클래스 감으로 이해하기

    클래스는 한마디로 "여러 곳에 재사용할 수 있는 디자인 템플릿"이라고 생각하면 편합니다. 마치 여러 사람이 공유해서 입을 수 있는 '교복'이나 '유니폼'과 같습니다. 같은 디자인의 버튼이 여러 개 필요하거나, 비슷한 형태의 카드형 UI가 페이지 곳곳에 배치될 때 클래스를 사용합니다.

    예를 들어, 웹사이트에 '로그인 버튼', '회원가입 버튼', '문의하기 버튼' 등 여러 개의 버튼이 있고, 이 모든 버튼이 둥근 모서리에 파란색 배경을 가졌으면 좋겠다고 해봅시다. 이때 각 버튼에 일일이 스타일을 지정하는 대신, .button-primary와 같은 클래스를 만들어서 그 클래스에 파란색 배경과 둥근 모서리 스타일을 정의합니다. 그리고 모든 버튼 HTML 요소에 이 클래스를 적용하는 것이죠.

    이렇게 하면 나중에 버튼 디자인을 변경해야 할 때, .button-primary 클래스의 스타일만 한 번 수정하면 모든 버튼의 디자인이 자동으로 바뀝니다. 여러 요소에 동일한 스타일을 적용하고, 그 스타일을 나중에 쉽게 변경하고 싶을 때 클래스는 정말 강력한 도구입니다.

    • 특징 여러 요소에 적용 가능하며, 반복적인 스타일링에 최적화되어 있습니다.
    • 비유 '데일리룩' '단체복' '공용 디자인 템플릿'
    • HTML 코드 예시<button class="primary-button">로그인</button><div class="card">...</div>
    • <div class="card">...</div>
    • <button class="primary-button">회원가입</button>
    •  
    • CSS 코드 예시.primary-button {  color: white;}  border: 1px solid #eee;  margin-bottom: 10px;
    • }
    •   padding: 15px;
    • .card {
    •   border-radius: 5px;
    •   background-color: blue;
    •  

    아이디 감으로 이해하기

    아이디는 "페이지 내에서 오직 하나만 존재해야 하는 고유한 이름"입니다. 마치 사람의 '주민등록번호'나 건물의 '주소'처럼, 특정 요소를 정확히 콕 집어서 지칭할 때 사용합니다. 웹 페이지에서 헤더(머리글), 푸터(바닥글), 메인 콘텐츠 영역과 같이 페이지 전체에서 단 하나만 존재하는 요소에 아이디를 부여하는 것이 일반적입니다.

    예를 들어, 웹사이트의 상단에 항상 고정되는 '메인 내비게이션 바'가 있다고 해봅시다. 이 내비게이션 바는 페이지에 단 하나만 존재하며, 다른 어떤 요소와도 헷갈릴 일이 없습니다. 이때 이 요소에 #main-nav와 같은 아이디를 부여하고, 여기에 고정 위치, 배경색, 높이 등의 스타일을 적용할 수 있습니다.

    아이디는 주로 특정 요소에 대한 강력한 참조가 필요할 때, 예를 들어 JavaScript로 해당 요소를 직접 제어하거나, 페이지 내에서 특정 위치로 바로 이동하는 앵커 링크를 만들 때 유용하게 활용됩니다.

    • 특징 페이지 내에서 유일해야 하며, 특정 요소를 정확히 지목할 때 사용합니다.
    • 비유 '주민등록번호' '건물 주소' '단 하나뿐인 특별한 아이템'
    • HTML 코드 예시<header id="main-header">...</header><footer id="page-footer">...</footer>
    •  
    • <nav id="global-nav">...</nav>
    •  
    • CSS 코드 예시#main-header {  height: 80px;  color: white;#global-nav {  top: 0;  z-index: 1000;
    • }
    •   left: 0;
    •   position: fixed;
    • }
    •   background-color: #333;
    •   width: 100%;
    •  

    클래스와 아이디 실전 활용 가이드

    이제 감으로 이해한 내용을 바탕으로 실제 웹 개발에서 어떻게 활용하는지 좀 더 구체적으로 알아보겠습니다.

    클래스는 언제 사용해야 할까요

    대부분의 상황에서 클래스를 사용하는 것이 좋습니다. 클래스는 유연하고 재사용성이 높아 웹 페이지의 유지보수를 쉽게 만듭니다.

    • 반복되는 UI 요소
    • 버튼, 카드, 목록 항목, 폼 입력 필드 등 디자인이 동일하거나 비슷한 요소가 여러 개 있을 때 사용합니다. 예를 들어, .product-card, .menu-item, .form-input 등으로 정의할 수 있습니다.
    • 요소의 상태 변화
    • 마우스를 올렸을 때(호버), 클릭했을 때(활성화), 숨겨져 있을 때(비활성화) 등 요소의 상태에 따라 스타일이 바뀌어야 할 때 클래스를 추가하거나 제거하여 효과를 줍니다. .is-active, .is-hidden, .has-error 등의 클래스를 활용합니다.
    • 컴포넌트 기반 개발
    • 재사용 가능한 UI 컴포넌트를 만들 때 클래스는 핵심적인 역할을 합니다. 각 컴포넌트의 내부 요소에 클래스를 부여하여 독립적인 스타일을 적용할 수 있습니다.
    • 레이아웃 시스템
    • 그리드 시스템이나 플렉스박스를 사용하여 레이아웃을 구성할 때, .col-6, .flex-container, .item-center 등과 같은 클래스를 사용하여 유연하게 배치할 수 있습니다.

    아이디는 언제 사용해야 할까요

    아이디는 페이지 내에서 단 하나뿐인, 고유한 의미를 가지는 요소에만 제한적으로 사용하는 것이 좋습니다.

    • 페이지의 주요 구조 요소
    • 웹 페이지의 전체적인 레이아웃을 구성하는 가장 큰 단위의 요소들, 예를 들어 <header>, <main>, <footer>, <aside>, <nav> 등의 요소에 아이디를 부여할 수 있습니다. #main-header, #main-content, #page-footer 등이 그 예시입니다.
    • JavaScript로 특정 요소를 직접 제어할 때
    • JavaScript에서 document.getElementById('myElement')와 같이 특정 요소를 정확히 찾아내어 조작해야 할 때 아이디가 유용합니다. 아이디는 고유성을 보장하므로, 원하는 요소를 정확하게 선택할 수 있습니다.
    • 페이지 내 앵커 링크
    • 긴 페이지에서 특정 섹션으로 스크롤하여 이동하는 '목차'나 '맨 위로' 버튼을 만들 때 아이디를 사용합니다. <a href="#section-about">소개</a>와 같이 링크를 만들고, 해당 섹션에 <div id="section-about">을 부여하여 연결합니다.
    • 폼 요소와 레이블 연결
    • 접근성을 높이기 위해 <label for="username">과 <input type="text" id="username">처럼 폼의 레이블과 입력 필드를 연결할 때 아이디를 사용합니다.

    클래스와 아이디 기술적 차이점

    감으로 이해하는 것을 넘어, 클래스와 아이디는 몇 가지 중요한 기술적 차이점을 가지고 있습니다.

    선택자 우선순위

    CSS는 여러 스타일 규칙이 충돌할 때 어떤 규칙을 적용할지 결정하는 '우선순위(Specificity)' 개념이 있습니다. 여기서 아이디 선택자(#id)는 클래스 선택자(.class)보다 훨씬 높은 우선순위를 가집니다.

    • 아이디 선택자 100점의 우선순위를 가집니다.
    • 클래스 선택자 10점의 우선순위를 가집니다.
    • 예시
      .my-class { color: blue; }
    • <div id="my-element" class="my-class">이 글자는 빨간색일까요 파란색일까요?</div>
    • #my-element { color: red; }
    • 만약 어떤 요소에 id="my-element"와 class="my-class"가 동시에 적용되어 있고, 두 선택자 모두 color 속성을 다르게 정의했다면, 아이디 선택자에 정의된 color 값이 적용됩니다.

    이 높은 우선순위 때문에 아이디는 남용하면 스타일 관리가 어려워질 수 있습니다. 아이디로 적용된 스타일을 덮어쓰려면 더 높은 우선순위의 선택자(예: 인라인 스타일)를 사용해야 하므로, 코드가 복잡해지고 예측하기 어려워질 수 있습니다.

    JavaScript에서의 활용

    JavaScript로 HTML 요소를 조작할 때도 클래스와 아이디는 다르게 사용됩니다.

    • 아이디를 통한 접근
    • document.getElementById('myId') 메서드를 사용합니다. 이 메서드는 페이지 내에서 해당 아이디를 가진 '단 하나의 요소'를 반환합니다. 가장 빠르고 직접적인 요소 접근 방법 중 하나입니다.
    • 클래스를 통한 접근
    • document.getElementsByClassName('myClass') 메서드를 사용합니다. 이 메서드는 해당 클래스를 가진 '모든 요소의 컬렉션(배열과 유사)'을 반환합니다. 여러 요소를 한 번에 조작해야 할 때 유용합니다.

    흔한 오해와 사실 관계

    클래스와 아이디에 대해 사람들이 자주 오해하는 부분들을 짚어보겠습니다.

    오해 1 아이디는 무조건 하나만 쓸 수 있다

    • 사실 HTML 명세에 따르면, 한 페이지 내에서 동일한 id 값을 가진 요소는 오직 하나만 존재해야 합니다. 하지만, 기술적으로 브라우저가 여러 요소에 같은 id가 부여되어도 오류를 발생시키지는 않습니다. 다만, 이는 HTML 표준을 위반하는 것이며, JavaScript의 getElementById() 같은 메서드가 예상치 못한 결과를 반환하거나, 접근성 도구에서 문제가 발생할 수 있습니다. 따라서 '무조건 하나만 사용해야 한다'는 규칙을 지키는 것이 매우 중요합니다.

    오해 2 클래스는 아이디보다 성능이 안 좋다

    • 사실 과거에는 아이디 선택자가 클래스 선택자보다 브라우저 렌더링 성능이 좋다는 이야기가 있었습니다. 하지만 현대의 웹 브라우저는 매우 빠르게 발전했으며, 대부분의 경우 클래스와 아이디 선택자 간의 성능 차이는 미미하여 일반적인 웹 개발에서는 고려할 수준이 아닙니다. 오히려 적절한 구조와 의미 있는 이름으로 클래스를 잘 활용하는 것이 전체적인 성능과 유지보수성에 훨씬 더 큰 영향을 미칩니다.

    오해 3 무조건 아이디 대신 클래스만 써야 한다

    • 사실 아이디의 높은 우선순위 때문에 스타일 관리가 어려울 수 있다는 점 때문에 '아이디는 아예 쓰지 말라'는 극단적인 조언을 듣기도 합니다. 하지만 아이디는 분명히 그 목적과 역할이 있습니다. 페이지의 고유한 구조를 정의하거나, JavaScript로 특정 요소를 정확히 지목해야 할 때, 앵커 링크를 사용할 때 아이디는 매우 유용합니다. 중요한 것은 '목적에 맞게' 사용하는 것입니다. 재사용이 필요한 스타일은 클래스로, 페이지 내에서 유일한 요소에 대한 강력한 참조는 아이디로 사용하는 균형 잡힌 접근이 가장 좋습니다.

    유용한 팁과 조언

    클래스와 아이디를 효과적으로 사용하기 위한 실용적인 팁들입니다.

    클래스 우선 사용 원칙

    새로운 요소를 만들고 스타일을 적용해야 할 때, 일단 클래스를 사용하는 것을 기본 원칙으로 삼으세요. 대부분의 경우 클래스로 충분하며, 이는 코드의 재사용성과 유연성을 높여줍니다. 아이디는 정말 '이 요소는 이 페이지에서 유일무이하며, 특별한 목적으로 지목되어야 한다'는 확신이 들 때만 고려하세요.

    의미 있는 이름 짓기

    클래스나 아이디의 이름을 지을 때는 그 요소의 역할이나 목적을 명확히 드러내는 이름을 사용하세요. 예를 들어, .red-text 대신 .error-message나 .highlight-text처럼 의미를 부여하는 것이 좋습니다. BEM(Block Element Modifier)과 같은 CSS 명명 규칙을 학습하고 적용하면 더욱 체계적인 이름을 지을 수 있습니다.

    아이디는 꼭 필요할 때만 사용하기

    앞서 언급했듯이, JavaScript로 특정 요소를 제어하거나 앵커 링크를 만들 때, 또는 폼 요소와 레이블을 연결할 때처럼 명확한 이유가 있을 때만 아이디를 사용하세요. 단순히 스타일을 적용하기 위해 아이디를 남발하는 것은 좋지 않습니다.

    클래스 여러 개 함께 사용하기

    HTML 요소에는 여러 개의 클래스를 동시에 적용할 수 있습니다. 스페이스로 구분하여 여러 클래스 이름을 나열하면 됩니다. 예를 들어, <button class="button primary large">처럼 사용하여 '버튼'의 기본 스타일, '주요' 버튼 스타일, '큰' 버튼 스타일을 한 번에 적용할 수 있습니다. 이는 스타일의 조합과 재사용성을 극대화하는 좋은 방법입니다.

    아이디와 클래스 함께 사용하기

    하나의 HTML 요소에 아이디와 클래스를 동시에 적용하는 것도 가능합니다. 예를 들어, <div id="main-content" class="container">와 같이 사용할 수 있습니다. 이 경우 #main-content는 이 요소가 페이지의 주 콘텐츠 영역임을 나타내는 고유한 식별자 역할을 하고, .container는 이 요소의 너비나 패딩 등을 정의하는 재사용 가능한 레이아웃 클래스 역할을 합니다.

    전문가들의 조언

    많은 프론트엔드 개발 전문가들은 클래스 사용을 적극적으로 권장합니다. 그 이유는 다음과 같습니다.

    • 유지보수성 향상
    • 클래스는 재사용성이 높고, 스타일 변경 시 한 곳만 수정하면 되므로 유지보수 비용을 크게 절감할 수 있습니다. 아이디의 높은 우선순위는 스타일을 덮어쓰기 어렵게 만들어 유지보수를 복잡하게 할 수 있습니다.
    • 유연한 확장성
    • 웹 페이지는 끊임없이 변화하고 확장됩니다. 클래스를 기반으로 디자인하면 새로운 기능을 추가하거나 기존 기능을 수정할 때 기존 스타일을 쉽게 재활용하거나 확장할 수 있습니다.
    • 컴포넌트 기반 아키텍처 지원
    • 최신 웹 개발 트렌드는 UI를 독립적인 컴포넌트 단위로 나누어 개발하는 것입니다. 클래스는 이러한 컴포넌트들이 서로 영향을 주지 않고 독립적으로 스타일링될 수 있도록 돕습니다.
    • 협업의 용이성
    • 명확하고 의미 있는 클래스 이름은 여러 개발자가 함께 작업할 때 코드 이해도를 높이고 충돌을 줄여줍니다. 아이디는 고유성을 보장해야 하므로, 여러 개발자가 아이디 이름을 짓다 보면 충돌이 발생하기 쉽습니다.

    결론적으로, 전문가들은 아이디를 '최후의 수단'처럼, 정말 고유한 식별이 필요한 경우에만 사용하고, 대부분의 스타일링은 클래스로 처리할 것을 권장합니다.

    자주 묻는 질문

    질문 1 아이디와 클래스를 혼용해도 되나요

    • 답변 네, 물론입니다. 실제 웹 개발에서는 아이디와 클래스를 목적에 맞게 혼용하는 것이 일반적이고 바람직합니다. 예를 들어, 페이지의 최상위 컨테이너에는 id="app"과 같은 아이디를 부여하고, 그 안에 있는 UI 컴포넌트들에는 class="card", class="button" 등의 클래스를 적용할 수 있습니다. 중요한 것은 각 선택자의 역할과 특성을 이해하고 적절하게 사용하는 것입니다.

    질문 2 아이디 대신 클래스만 사용하면 안 되나요

    • 답변 기술적으로는 대부분의 스타일링을 클래스로만 처리하는 것이 가능합니다. 많은 개발자들이 아이디의 높은 우선순위로 인한 문제를 피하기 위해 아이디 사용을 최소화하고 클래스 위주로 개발합니다. 하지만, JavaScript에서 특정 요소를 직접적으로 찾아야 하거나, 페이지 내 앵커 링크를 설정하는 등 아이디가 제공하는 '고유성'이 명확하게 필요한 경우에는 아이디를 사용하는 것이 더 효율적이고 의미론적입니다. 무조건적인 배제보다는 필요에 따른 현명한 선택이 중요합니다.

    질문 3 CSS에서 아이디를 많이 사용하면 어떤 문제가 생기나요

    • 답변 아이디를 과도하게 사용하면 다음과 같은 문제가 발생할 수 있습니다.
      1. 높은 우선순위로 인한 스타일 충돌 및 관리의 어려움
      2. 아이디 선택자는 우선순위가 매우 높기 때문에, 아이디로 적용된 스타일을 다른 클래스나 태그 선택자로 덮어쓰기가 어렵습니다. 결국 !important를 사용하거나 더 복잡한 선택자를 만들어야 하는 상황이 발생하여 CSS 코드가 지저분해지고 유지보수가 힘들어집니다.
      3. 재사용성 저하
      4. 아이디는 페이지 내에서 고유해야 하므로, 한 번 사용된 아이디는 다른 요소에 재사용할 수 없습니다. 이는 코드의 재사용성을 떨어뜨리고, 비슷한 디자인의 요소를 만들 때마다 새로운 아이디를 만들거나 인라인 스타일을 사용하게 만들어 비효율적입니다.
      5. 모듈화의 방해
      6. 재사용 가능한 UI 컴포넌트를 만들 때, 컴포넌트 내부에 아이디를 사용하면 해당 컴포넌트를 여러 번 사용할 때 아이디 중복 문제가 발생합니다. 이는 컴포넌트의 독립적인 모듈화를 방해합니다.

    이러한 이유로 아이디는 꼭 필요한 경우에만 신중하게 사용하는 것이 좋습니다.

    비용 효율적인 활용 방법

    클래스와 아이디를 잘 활용하는 것은 단순히 코드의 깔끔함을 넘어, 장기적으로 개발 및 유지보수 비용을 절감하는 데 큰 도움이 됩니다.

    개발 시간 단축

    재사용 가능한 클래스를 많이 만들어두면, 새로운 UI 요소를 개발할 때마다 처음부터 스타일을 작성할 필요 없이 기존 클래스를 조합하여 빠르게 적용할 수 있습니다. 이는 개발 시간을 크게 단축시키는 효과가 있습니다. 예를 들어, 미리 정의된 .button, .primary, .large 클래스를 조합하여 <button class="button primary large">와 같이 사용하면, 새로운 큰 파란색 버튼을 만들 때마다 CSS를 작성할 필요가 없습니다.

    유지보수 비용 절감

    잘 구조화된 클래스와 아이디는 코드 변경을 용이하게 합니다. 예를 들어, 웹사이트 전체의 버튼 디자인을 변경해야 할 때, .button 클래스의 스타일만 수정하면 모든 버튼에 변경 사항이 일괄 적용됩니다. 특정 페이지의 고유한 레이아웃을 변경해야 할 때도 #main-content와 같은 아이디를 통해 해당 영역만 정확하게 수정할 수 있어, 예상치 못한 부작용 없이 효율적인 유지보수가 가능합니다. 이는 장기적으로 인력과 시간을 절약하여 유지보수 비용을 줄이는 결과를 가져옵니다.

    협업 효율성 증대

    명확하고 일관된 클래스 및 아이디 명명 규칙은 여러 개발자가 함께 작업할 때 코드 이해도를 높이고 충돌을 줄여줍니다. 각 요소의 역할과 스타일이 이름만 봐도 예측 가능해지므로, 커뮤니케이션 비용이 줄어들고 작업 효율성이 높아집니다. 이는 프로젝트 전체의 비용 효율성을 높이는 중요한 요소입니다.

    성능 최적화

    적절한 클래스와 아이디 사용은 DOM 조작 및 렌더링 효율성을 증대시킬 수 있습니다. 물론 현대 브라우저에서는 이 차이가 미미하지만, 불필요하게 복잡하거나 비효율적인 선택자 사용을 피함으로써 브라우저가 스타일을 계산하고 적용하는 데 드는 부하를 최소화할 수 있습니다. 특히 JavaScript에서 getElementById는 매우 빠른 요소 접근 방법이므로, 고유 요소에 대한 접근이 필요할 때 이를 활용하면 미세한 성능 이점을 얻을 수 있습니다.